Tôi có EventHandler sau:Invoke của một EventHandler
private EventHandler<MyEventArgs> _myEventHandler;
public event EventHandler<MyEventArgs> MyEvent
{
add { _myEventHandler += value; }
remove { _myEventHandler -= value; }
}
ai đó có thể giải thích sự khác biệt giữa các đoạn sau đây?
Snippet EventHandler (A):
//Snippet A:
if (_myEventHandler != null)
{
_myEventHandler(new MyEventArgs());
}
Snippet BeginInvoke (B):
//Snippet B:
if (_myEventHandler != null)
{
_myEventHandler.BeginInvoke(new MyEventArgs(), ar =>
{
var del = (EventHandler<MyEventArgs>)ar.AsyncState;
del.EndInvoke(ar);
}, _myEventHandler);
}
Để làm rõ: sự khác biệt giữa cách gọi một EventHandler "chỉ vì nó là" và sử dụng BeginInvoke
là gì?
Nó không nhất thiết phải được gọi trên một chủ đề khác là nó? Gọi một đại biểu không đồng bộ vẫn được thực hiện trên cùng một luồng nhưng trả về thời điểm nó chặn AFAIK. –
@Jeff no; gọi một đại biểu không đồng bộ có nghĩa là nó xảy ra trên một chuỗi công nhân. Làm thế nào khác nó sẽ chạy không đồng bộ? Lưu ý rằng điều này là khác nhau một cách tinh tế với Control.BeginInvoke mà * có thể * tiếp tục trên cùng một chuỗi nếu bạn đã ở trên giao diện người dùng –
Nếu đại biểu được gọi đang thực hiện điều khiển IO (tức là khối) được trả về trang cuộc gọi. Khi hoàn thành, chuỗi ban đầu bị gián đoạn để hoàn thành phần còn lại của phương thức. Khi tôi hiểu nó, không có chủ đề mới được tạo ra, đó là tất cả các ngắt từ đó. –