Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NotifyPropertyChanged线程安全吗?_C#_Wpf_Silverlight - Fatal编程技术网

C# NotifyPropertyChanged线程安全吗?

C# NotifyPropertyChanged线程安全吗?,c#,wpf,silverlight,C#,Wpf,Silverlight,我正在查看INotifyPropertyChanged中的NotifyPropertyChanged(),并注意到在Microsoft的示例中,例如: 没有先捕获委托引用(如此处所述,例如:) 我在自动生成的Reference.cs中查看了我的ServiceReferences,该检查已完成 所以我的问题是我应该这样做(以任何形式,比如扩展方法等)?如果我不这样做,是否存在任何可能的问题?你是对的,应该进行检查,并且他们的示例是错误的 下面是标准代码 private void NotifyPr

我正在查看
INotifyPropertyChanged
中的
NotifyPropertyChanged()
,并注意到在Microsoft的示例中,例如:

没有先捕获委托引用(如此处所述,例如:)

我在自动生成的Reference.cs中查看了我的ServiceReferences,该检查已完成


所以我的问题是我应该这样做(以任何形式,比如扩展方法等)?如果我不这样做,是否存在任何可能的问题?

你是对的,应该进行检查,并且他们的示例是错误的

下面是标准代码

private void NotifyPropertyChanged(String propertyName)
{
    var handler = PropertyChanged;
    if (handler != null)
    {
        handler (this, new PropertyChangedEventArgs(propertyName));
    }
}
编辑:进一步解释为什么需要这样做(以及为什么这样做有效)


在MS示例中,它们直接对PropertyChanged执行空检查,然后调用它。因此,在null检查和调用之间,PropertyChanged有可能变为null。通过将委托分配给局部变量,我们可以确保保留对委托的引用,并且它不能在null检查和调用之间更改。

好的,我看到的Microsoft示例似乎不是最好的。谢谢你的回答,在微软的例子中,他们就是这么做的。。。我是瞎子吗?@fantasticfix PropertyChanged必须复制到局部变量first@fantasticfix是:)他们没有将委托分配给变量。所以它可能在空检查和调用它之间发生了变化。。。只是想写下,即使你避免了空引用,这也不会是线程保存。收回:)