Tôi có một kịch bản. (Biểu mẫu Windows, C #, .NET)
- Có một hình thức chính lưu trữ một số điều khiển người dùng.
- Điều khiển người dùng thực hiện một số thao tác dữ liệu nặng, như vậy nếu tôi gọi trực tiếp
UserControl_Load
phương thức thì UI sẽ không phản hồi trong thời gian thực hiện phương thức tải. - Để khắc phục điều này, tôi tải dữ liệu trên các luồng khác nhau (cố gắng thay đổi mã hiện có ít nhất có thể)
- Tôi đã sử dụng một luồng công nhân nền sẽ tải dữ liệu và khi hoàn thành sẽ thông báo cho ứng dụng rằng nó đã hoàn thành công việc.
- Bây giờ đến một vấn đề thực sự. Tất cả giao diện người dùng (biểu mẫu chính và các điều khiển người dùng con của nó) đã được tạo trên luồng chính chính. Trong phương thức LOAD của điều khiển người dùng, tôi đang tìm nạp dữ liệu dựa trên các giá trị của một số điều khiển (như hộp văn bản) trên userControl.
Mã giả sẽ trông như thế này:
MÃ 1
UserContrl1_LoadDataMethod()
{
if (textbox1.text == "MyName") // This gives exception
{
//Load data corresponding to "MyName".
//Populate a globale variable List<string> which will be binded to grid at some later stage.
}
}
Ngoại lệ mà nó đưa ra là
Hoạt động xuyên luồng không hợp lệ: Kiểm soát truy cập từ một luồng khác với luồng được tạo.
Để biết thêm về điều này, tôi đã làm một số việc và một gợi ý được đưa ra như sử dụng mã sau đây
MÃ 2
UserContrl1_LoadDataMethod()
{
if (InvokeRequired) // Line #1
{
this.Invoke(new MethodInvoker(UserContrl1_LoadDataMethod));
return;
}
if (textbox1.text == "MyName") // Now it wont give an exception
{
//Load data correspondin to "MyName"
//Populate a globale variable List<string> which will be binded to grid at some later stage
}
}
NHƯNG NHƯNG NHƯNG ... có vẻ như tôi trở lại hình vuông. Ứng dụng một lần nữa trở nên không phản hồi. Có vẻ là do việc thực hiện dòng # 1 nếu có điều kiện. Tác vụ tải được thực hiện lại bởi luồng gốc chứ không phải thứ ba mà tôi sinh ra.
Tôi không biết liệu tôi nhận ra điều này đúng hay sai. Tôi mới bắt đầu xâu chuỗi.
Làm cách nào để giải quyết vấn đề này và hiệu quả của việc thực thi Dòng # 1 là gì?
Tình huống là thế này : Tôi muốn tải dữ liệu vào một biến toàn cục dựa trên giá trị của điều khiển. Tôi không muốn thay đổi giá trị của điều khiển từ luồng con. Tôi sẽ không làm điều đó bao giờ từ một chủ đề con.
Vì vậy, chỉ truy cập giá trị để dữ liệu tương ứng có thể được tìm nạp từ cơ sở dữ liệu.