我注意到很多代码使用以下代码片段来调用事件处理程序.
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直接调用事件.那些之间有什么区别吗?
这是避免竞争条件的典型方法。
当您使用抢占式多任务系统时,或更糟糕的是,使用多核系统时,在检查if (Handler != null)和实际Handler(this, EventArgs.Empty);. 最重要的是,完全有可能不是Handler在null检查期间,而是在调用本身期间 - 现在您已经很难跟踪NullReferenceException.
相反,通过将 存储Handler到局部变量,您可以确保在进行检查和调用时没有其他线程会干扰它。
请注意,这仍然会让您面临其他类型的竞争条件:)
| 归档时间: |
|
| 查看次数: |
750 次 |
| 最近记录: |