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

Col*_*lin 5 c#

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

Public event EventHandler Handler;

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

为什么Handler在调用之前将其分配给局部变量而不是Handler直接调用事件.那些之间有什么区别吗?

Lua*_*aan 3

这是避免竞争条件的典型方法。

当您使用抢占式多任务系统时,或更糟糕的是,使用多核系统时,在检查if (Handler != null)和实际Handler(this, EventArgs.Empty);. 最重要的是,完全有可能不是Handlernull检查期间,而是在调用本身期间 - 现在您已经很难跟踪NullReferenceException.

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

请注意,这仍然会让您面临其他类型的竞争条件:)