我一直在其他人的代码中看到这种调用事件的模式:
void OnMyEvent()
{
var myEvent = MyEvent;
if (myEvent != null)
myEvent(this, EventArgs.Empty);
}
使用变量来引用事件
MyEvent
而不是直接使用 MyEvent(this, EventArgs.Empty)
有什么好处? 最佳答案
在多线程应用程序中,事件可能会在调用此方法的过程中取消订阅。
如果未以这种方式复制事件处理程序,这可能会导致 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
}
}
关于c# - 为什么要通过变量引用事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12420934/