线程安全事件处理

本文关键字:事件处理 安全 线程 | 更新日期: 2023-09-27 18:11:09

可能重复:
事件调度前检查null…线程安全
安全提升事件线程-最佳实践

protected void NotificationEvent(Object sender, EventArgs e)
{
    // Copy to a temporary variable to be thread-safe
    EventHandler<EventArgs> tmp = mNotification;
    if (tmp!= null)
    {
        tmp(this, null);
    }
}

复制mNotification如何确保线程安全。有人能解释一下吗?

线程安全事件处理

如果是

if (mNotification!=null)
{
    mNotification(this, null);
}

mNotification可以由if (mNotification!=null)mNotification(this, null);之间的另一个线程设置为null

它所做的是在该特定时刻复制对原始事件的引用,这样,如果在null检查后随后使用它,它将指向一个未计算为null的引用。如果不使用此模式,则可以检查它是否为null,所有处理程序都可以在另一个线程上取消订阅,然后事件在调用时将为null。复制原始引用可消除此潜在的线程问题。