如何安全地触发事件?

oli*_*dev 2 c# event-handling

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

public event EventHandler<ActionEventArgs> ActionDataReceived;

public void showLog(string logMessage)
{
   ActionDataReceived(this, new ActionEventArgs(logMessage));
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*mes 5

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

var handler = ActionDataReceived;
if (handler != null)
{
    handler(this, new ActionEventArgs(logMessage));
}
Run Code Online (Sandbox Code Playgroud)

这将缓解可能导致事件在您尝试提升之前被取消分配的竞争条件.


正如@EricLippert指出的那样,这并未涵盖在赋值发生更改处理程序的内部状态的情况.