4

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

void OnMyEvent()
{
  var myEvent = MyEvent;

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

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

4

1 回答 1

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 
  }
}
于 2012-09-14T08:45:07.383 回答