Đôi khi tôi sử dụng (trong Tải)
this.BeginInvoke((MethodInvoker) delegate {
// some code
});
hoặc là
this.BeginInvoke((MethodInvoker) this.SomeMethod);
(thay đổi "this" thành biến biểu mẫu của bạn nếu bạn đang xử lý sự kiện trên một thể hiện khác với "this").
Điều này đẩy lệnh gọi vào vòng lặp biểu mẫu windows, vì vậy nó được xử lý khi biểu mẫu đang xử lý hàng đợi tin nhắn.
[cập nhật theo yêu cầu]
Các phương thức Control.Invoke / Control.BeginInvoke được thiết kế để sử dụng với luồng và là một cơ chế để đẩy công việc lên luồng UI. Thông thường, điều này được sử dụng bởi các luồng công nhân, v.v. Control.Invoke thực hiện một cuộc gọi đồng bộ, trong đó Control.BeginInvoke thực hiện một cuộc gọi không đồng bộ.
Thông thường, chúng sẽ được sử dụng như:
SomeCodeOrEventHandlerOnAWorkerThread()
{
// this code running on a worker thread...
string newText = ExpensiveMethod(); // perhaps a DB/web call
// now ask the UI thread to update itself
this.Invoke((MethodInvoker) delegate {
// this code runs on the UI thread!
this.Text = newText;
});
}
Nó thực hiện điều này bằng cách đẩy một tin nhắn lên hàng đợi tin nhắn windows; luồng UI (tại một số điểm) hủy xếp hàng tin nhắn, xử lý ủy nhiệm và báo hiệu cho nhân viên rằng nó đã hoàn thành ... cho đến nay rất tốt ;-p
ĐỒNG Ý; Vậy điều gì xảy ra nếu chúng ta sử dụng Control.Invoke / Control.BeginInvoke trên luồng UI? Nó đối phó ... nếu bạn gọi Control.Invoke, đủ khả năng để biết rằng việc chặn trên hàng đợi tin nhắn sẽ gây ra bế tắc ngay lập tức - vì vậy nếu bạn đã ở trên luồng UI, nó chỉ cần chạy mã ngay lập tức ... không giúp chúng tôi ...
Nhưng Control.BeginInvoke hoạt động khác: nó luôn đẩy công việc lên hàng đợi, ngay cả khi chúng ta đã có trên luồng UI. Điều này thực hiện một cách thực sự đơn giản để nói "trong một khoảnh khắc", nhưng không có sự bất tiện của bộ hẹn giờ, v.v. (dù sao vẫn sẽ phải làm điều tương tự!).