我一直在其他人的代码中看到这种调用事件的模式:
void OnMyEvent()
{
var myEvent = MyEvent;
if (myEvent != null)
myEvent(this, EventArgs.Empty);
}
使用变量引用事件MyEvent
有什么好处,而不是直接使用MyEvent(this, EventArgs.Empty)
?
答案 0 :(得分:8)
在多线程应用程序中,该事件可能会在此方法的调用过程中取消订阅。
如果不以这种方式复制事件处理程序,则会导致NullReferenceException
。
void OnMyEvent()
{
if (MyEvent!= null) // Thread A checks event
{ // Thread B unsubscribes _last_ handler
MyEvent(this, EventArgs.Empty); // Boom!
}
}
但是:
void OnMyEvent()
{
var myEvent = MyEvent; // Thread A gets _copy_ of invocation list
if (myEvent != null) // Using copy, so no problem
{ // Thread B unsubscribes _last_ handler
myEvent(this, EventArgs.Empty); // Still using copy, so no problem
}
}