如何安全地触发事件

本文关键字:事件 安全 何安全 | 更新日期: 2023-09-27 18:12:28

我不确定这是否是在c#中触发事件的方式:

public event EventHandler<ActionEventArgs> ActionDataReceived;
public void showLog(string logMessage)
{
   ActionDataReceived(this, new ActionEventArgs(logMessage));
}

如何安全地触发事件

安全的方法是获取处理程序的副本并引发它,即

var handler = ActionDataReceived;
if (handler != null)
{
    handler(this, new ActionEventArgs(logMessage));
}

这将缓解竞争条件,这种竞争条件可能导致事件在您尝试引发它之前被取消分配。


正如@EricLippert所指出的,不包含在赋值发生后处理程序的内部状态改变的场景。

var temp = ActionDataReceived;
if (temp != null)
      temp();

你可以参考Eric Lippert的这篇文章来获得详细的解释。