在调用之前将EventHandler分配给局部变量

时间:2016-02-15 16:17:57

标签: c#

我注意到很多代码使用以下代码片段来调用事件处理程序。

Public event EventHandler Handler;

Protected void OnEvent(){
      var handler = this.Handler;
      If(null!=handler){
          handler(this, new EventArgs());
      }
}

为什么在调用Handler而不是直接在Handler上调用事件之前,它会将tools.jar分配给局部变量。这些之间有什么区别吗?

1 个答案:

答案 0 :(得分:3)

这是避免竞争状况的典型方法。

如果您使用的是先发制人的多任务系统,或者更糟糕的是多核系统,那么if (Handler != null)检查和实际Handler(this, EventArgs.Empty);之间可能会发生很多事情。最重要的是,检查期间Handler完全可能不是null,而是在调用期间 - 现在你很难跟踪NullReferenceException

相反,通过将Handler存储到局部变量,您可以确保在执行检查和调用时没有其他线程会弄乱它。

请注意,这仍然让您对其他种类的竞争条件开放:)