我注意到很多代码使用以下代码片段来调用事件处理程序。
Public event EventHandler Handler;
Protected void OnEvent(){
var handler = this.Handler;
If(null!=handler){
handler(this, new EventArgs());
}
}
为什么在调用Handler
而不是直接在Handler
上调用事件之前,它会将tools.jar
分配给局部变量。这些之间有什么区别吗?
答案 0 :(得分:3)
这是避免竞争状况的典型方法。
如果您使用的是先发制人的多任务系统,或者更糟糕的是多核系统,那么if (Handler != null)
检查和实际Handler(this, EventArgs.Empty);
之间可能会发生很多事情。最重要的是,检查期间Handler
完全可能不是null
,而是在调用期间 - 现在你很难跟踪NullReferenceException
。
相反,通过将Handler
存储到局部变量,您可以确保在执行检查和调用时没有其他线程会弄乱它。
请注意,这仍然让您对其他种类的竞争条件开放:)