我找到了一些简单事件发送的例子。
我不理解第EventHandler<string> handler = MyEvent;
行
为什么他们需要定义对事件的引用而不只是使用myEvent
进行调用?
代码
public event EventHandler<string> MyEvent;
protected void SendEvent(string e)
{
EventHandler<string> handler = MyEvent;
if (handler != null)
{
handler(this, e);
}
}
答案 0 :(得分:3)
我找到了答案here。
在多线程环境中,客户端可以在检查null之后取消订阅事件,但在实际调用之前,在这种情况下MyEvent将为null。
答案 1 :(得分:1)
if (MyEvent!= null)
{
// If MyEvent is set to NULL (unsubscribed) in another thread
// between these two lines, the program crashes.
MyEvent(this, e);
}
EventHandler<string> handler = MyEvent;
if (handler != null)
{
// GC cannot connect MyEvent because there is additional reference to it - handler.
// handler is local and cannot be set to NULL from another thread.
// The code is thread safe.
handler(this, e);
}
答案 2 :(得分:1)
原因是由于线程安全。在null检查和调用之间,可以从另一个线程中取消订阅事件处理程序,如果您没有进行该分配,则为您留下空值。