【问题标题】:Is NotifyPropertyChanged thread safe?NotifyPropertyChanged 线程安全吗?
【发布时间】:2011-10-27 08:55:59
【问题描述】:

我正在查看来自INotifyPropertyChangedNotifyPropertyChanged(),并注意到在 Microsoft 的示例中,例如:

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

首先没有捕获委托引用(正如这里所说的,例如:Use of null check in event handler

我查看了为我的 ServiceReferences 自动生成的 Reference.cs 并完成了这项检查。

所以我的问题是我应该这样做(以任何形式,例如扩展方法等)吗?如果我不这样做会不会有什么问题?

【问题讨论】:

    标签: c# wpf silverlight


    【解决方案1】:

    你是对的,应该做检查,他们的例子是错误的。

    以下是标准代码。

    private void NotifyPropertyChanged(String propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler (this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    编辑:进一步解释为什么需要这样做(以及为什么会起作用)

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

    【讨论】:

    • 好吧,看来我见过的微软例子不是最好的。感谢您的回复
    • 他们在 MS 示例中就是这样做的……我是瞎了吗?
    • @fantasticfix PropertyChanged 必须先复制到局部变量
    • @fantasticfix 是的 :) 他们没有将委托分配给变量。所以它可能在 null 检查和调用它之间发生了变化。
    • 好的,完全同意...只是想写一下,即使您避免使用空引用,这也不会是线程保存。把它拿回来:)
    猜你喜欢
    • 2020-04-15
    • 2011-07-04
    • 2014-04-26
    • 2012-11-30
    • 2010-12-30
    • 2013-03-12
    • 2021-08-03
    • 2010-12-27
    • 2018-06-04
    相关资源
    最近更新 更多