【问题标题】:Why reference an event through a variable?为什么要通过变量引用事件?
【发布时间】:2012-09-14 08:42:52
【问题描述】:

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

void OnMyEvent()
{
  var myEvent = MyEvent;

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

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

【问题讨论】:

  • 如果MyEvent 在检查和调用之间被设置为null?
  • @Rawling:没错。我记得他们是 > 中关于这个主题的部分。

标签: c# events coding-style


【解决方案1】:

在多线程应用程序中,事件可能会在调用此方法的过程中被取消订阅。

如果未以这种方式复制事件处理程序,这可能会导致 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 
  }
}

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 2019-05-10
    • 2013-08-22
    • 2017-01-20
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 2014-08-16
    相关资源
    最近更新 更多