在调用之前,将事件处理程序分配给一个本地变量

5
我注意到许多代码都使用以下代码片段来调用事件处理程序。
Public event EventHandler Handler;

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

为什么在调用事件处理程序时,要先将Handler分配给局部变量,而不是直接在Handler上调用事件呢?这两者有什么区别吗?


1
这篇之前的帖子是否也适用于你的问题? - Igor
1
我建议您查看Eric Lipert在MSDN上的文章 https://blogs.msdn.microsoft.com/ericlippert/2009/04/29/events-and-races/ - Rodrigo Vedovato
2
尝试使用这个线程。对于这些问题,谷歌是非常宝贵的资源。https://dev59.com/x2435IYBdhLWcg3w50f4 - DV8DUG
这是更好的参考:https://dev59.com/8HRA5IYBdhLWcg3w6SNH - mybirthname
1个回答

3
这是一种避免竞态条件的典型方法。
当您在一个抢先式多任务系统,或更糟糕的,一个多核系统中时,if (Handler != null)检查和实际Handler(this, EventArgs.Empty);调用之间可能会发生很多事情。最重要的是,Handler在检查期间可能不为null,但在调用本身期间却为null - 现在你有一个非常难以跟踪的NullReferenceException
相比之下,通过将Handler存储到本地变量中,您可以确保没有其他线程会在进行检查和调用时搞乱它。
请注意,这仍然使您面临其他类型的竞争条件 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接