为什么通过变量引用事件?

时间:2012-09-14 08:42:53

标签: c# events coding-style

我一直在其他人的代码中看到这种调用事件的模式:

void OnMyEvent()
{
  var myEvent = MyEvent;

  if (myEvent != null)
    myEvent(this, EventArgs.Empty);
}

使用变量引用事件MyEvent有什么好处,而不是直接使用MyEvent(this, EventArgs.Empty)

1 个答案:

答案 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 
  }
}