c# - C# 的空条件委托(delegate)调用线程安全吗?

标签 c# multithreading

<分区>

这就是我一直以来编写事件引发器的方式;例如 PropertyChanged:

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string name)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(name));
    }

然而,在最新的 Visual Studio 中,灯泡 thingamabob 建议将代码简化为:

    private void RaisePropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

虽然我一直赞成简化,但我想确保这是安全的。在我的原始代码中,我将处理程序分配给一个变量,以防止出现竞争条件,在这种情况下,订阅者可能会在 null 检查和调用之间被处置。在我看来,新的简化形式会遇到这种情况,但我想看看是否有人可以证实或否认这一点。

最佳答案

它与它替换的代码(您的第一个示例)一样是线程安全的,因为它正在做完全相同的事情,只是使用一个隐藏变量。

关于c# - C# 的空条件委托(delegate)调用线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36425898/

相关文章:

java - Android java线程 sleep 示例

c# - 如何优雅地关闭异步服务器套接字? C#

c# - Google Drive api v3 响应为空

c# - C# 中的 BinaryFormatter 是一种读取文件的好方法吗?

c# - jqGrid subGridRowExpanded 功能无法正常工作

c++ - 如果我从不同的线程调用一个对象成员函数会发生什么?

c# - 是否可以在 C# 中定义内部类型的 protected 属性?

c++ - 如果我不在发布版本中加入 "destruction"上的线程怎么办?

c# - WPF : How to not block the GUI thread in HwndHost. BuildWindowCore 中的死锁?

java - 终止并向 Executor 提交可调用对象