Tôi đã thực hiện một số nghiên cứu và tôi thực sự không thể tìm thấy một cách ưa thích để cập nhật các điều khiển biểu mẫu từ một chuỗi công nhân trong C#. Tôi biết về thành phần BackgroundWorker, nhưng cách tốt nhất để làm điều đó mà không cần sử dụng thành phần BackgroundWorker là gì?Cách tốt nhất để cập nhật điều khiển biểu mẫu từ chuỗi công việc là gì?
Trả lời
Có một quy tắc chung chung là không cập nhật giao diện người dùng từ bất kỳ chuỗi nào khác ngoài chính chuỗi giao diện người dùng. Sử dụng các tính năng của BackgroundWorker là một ý tưởng hay, nhưng bạn không muốn và một cái gì đó đang xảy ra trên một luồng khác, bạn nên thực hiện một "Invoke" hoặc BeginInvoke để buộc ủy nhiệm thực hiện phương thức trên thread UI.
Edit: Jon B làm điểm tốt này trong các ý kiến:
Hãy ghi nhớ rằng Gọi() là đồng bộ và BeginInvoke() là không đồng bộ. Nếu bạn sử dụng Invoke(), bạn phải cẩn thận để không gây ra tình trạng bế tắc . Tôi sẽ giới thiệu BeginInvoke() trừ khi bạn thực sự cần cuộc gọi để được đồng bộ.
Một số đơn giản mã ví dụ:
// Updates the textbox text.
private void UpdateText(string text)
{
// Set the textbox text.
m_TextBox.Text = text;
}
public delegate void UpdateTextCallback(string text);
// Then from your thread you can call this...
m_TextBox.Invoke(new UpdateTextCallback(this.UpdateText),
new object[]{"Text generated on non-UI thread."});
Đoạn mã trên là từ một hỏi thường gặp về nó here và còn tham gia nhiều hơn một here.
Tại sao bạn không muốn làm điều đó bằng cách sử dụng BackgroundWorker? Nó có một sự kiện gọi lại tuyệt vời được gọi là ProgressChanged cho phép chuỗi giao diện người dùng biết về các bản cập nhật, hoàn hảo cho các bản cập nhật kiểu thanh progess và tương tự.
Tôi cũng sẽ xem xét InvokeRequired (chỉ dành cho VS2008) khi gọi Invoke. Có những lúc bạn sẽ không cập nhật giao diện người dùng từ một chuỗi riêng biệt. Nó tiết kiệm chi phí của việc tạo đại biểu, v.v.
if (InvokeRequired)
{
//This.Invoke added to circumvent cross threading exceptions.
this.Invoke(new UpdateProgressBarHandler(UpdateProgressBar), new object[] { progressPercentage });
}
else
{
UpdateProgressBar(progressPercentage);
}
- 1. Cách tốt nhất để xóa tất cả các điều khiển trên biểu mẫu C# là gì?
- 2. Điều khiển trình duyệt web tốt nhất để sử dụng trên Ứng dụng Biểu mẫu Windows là gì?
- 3. Cách tốt nhất để xử lý các biểu mẫu lặp trong MVC là gì?
- 4. Điều khiển biểu mẫu động
- 5. Cách tốt nhất để lưu trạng thái điều khiển của biểu mẫu Winform?
- 6. Cách tốt nhất để cập nhật dữ liệu cơ bản của Adapter là gì?
- 7. Cách truy cập điều khiển biểu mẫu cho biểu mẫu khác?
- 8. Cách tốt nhất để giữ thư viện javascript cập nhật trong đường ray là gì?
- 9. Cách tốt nhất để tăng một điều tra là gì?
- 10. Cách tốt nhất để hợp nhất các biến mẫu (để truyền dữ liệu từ bộ điều khiển đến khung nhìn) trong Rails là gì?
- 11. Bộ điều khiển Ribbon WPF tốt nhất là gì?
- 12. Cách tốt nhất để tạo biểu mẫu tìm kiếm mô hình là gì?
- 13. Cách tốt nhất để đợi Biểu mẫu được đóng trong MS Access VBA là gì?
- 14. Pop-up lịch tốt nhất để điền một biểu mẫu web là gì?
- 15. AngularJS - Cách tốt nhất để cập nhật thông số tuyến $
- 16. Cách tốt nhất để lưu trữ cơ sở dữ liệu MySQL trong điều khiển nguồn là gì?
- 17. Trình điều khiển java tốt nhất cho truy cập mongodb là gì?
- 18. Vấn đề luồng Winforms, chuỗi thứ hai không thể truy cập các điều khiển biểu mẫu chính thứ nhất
- 19. Cách tốt nhất để tích hợp điều khiển phiên bản TFS là gì
- 20. Cách tốt nhất để bắt ngoại lệ trong Công việc là gì?
- 21. Cách tốt nhất để có được giao diện điều khiển-đầu vào trong Java là gì?
- 22. Cách tốt nhất để tải lên tệp qua HTTP POST bằng biểu mẫu web là gì?
- 23. Cập nhật giao diện người dùng từ nhiều chuỗi công việc (.NET)
- 24. Cách tốt nhất để gọi phương thức ngay sau khi tải biểu mẫu là gì?
- 25. Cách tốt nhất để chạy công việc không đồng bộ trong ứng dụng Rails là gì?
- 26. Cách tốt nhất để phân tích chuỗi là gì?
- 27. Cách nhanh nhất để cập nhật các bản ghi hiện có bằng một chuỗi là gì?
- 28. Twitter để cập nhật công việc
- 29. Cách tốt nhất để trượt một bảng điều khiển trong WPF là gì?
- 30. Cách tốt nhất để thực thi mã điều khiển Xuân lặp đi lặp lại là gì?
Chính xác thì m_TextBox.Invoke làm gì? Liệu nó buộc các đại biểu được thực hiện trên thread UI? – Yttrium
Chính xác. Hãy nhớ rằng Invoke() là đồng bộ và BeginInvoke() là không đồng bộ. Nếu bạn sử dụng Invoke(), bạn phải cẩn thận không gây ra bế tắc. Tôi muốn giới thiệu BeginInvoke() trừ khi bạn thực sự cần cuộc gọi để được đồng bộ. –
Cuộc gọi tốt, Jon B. Tôi nên đề cập đến điều đó. Tôi sẽ chỉnh sửa để phản ánh quan điểm. –