2010-12-16 56 views
5

我已经看到用于实现INotifyPropertyChanged的用于实现INotifyPropertyChanged的模式?

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

public event PropertyChangedEventHandler PropertyChanged; 

有人可以给我的VAR处理程序的必要性检查它的空与直接检查的PropertyChanged之前=的PropertyChanged分配解释== NULL以下模式直?

感谢

+0

可能的重复[为什么C#要求你在每次触发事件时都写一个空检查?](http://stackoverflow.com/questions/3102918/why-does-c-require-you-to-write-a-null-check-every-time-you-fire-an-event) – decyclone 2010-12-16 14:48:00

+0

@decyclone ,这不是一个骗局...... OP不问你为什么必须检查处理程序是否为空,但为什么你需要使用处理程序的本地副本。 – 2010-12-16 14:55:19

+0

VB.NET是否需要这种模式?或者RaiseEvent为你处理? – MCattle 2014-02-13 19:06:47

回答

4

Eric Lippert在本博客文章中详细解释了这一点:Events and races

基本上,当您检查PropertyChanged != null之后,但在您实际调用PropertyChanged之前,如果另一个线程取消订阅此事件的最后一个处理程序,则该想法基本上可以避免竞争条件。如果你制作一个处理程序的本地副本,这不会发生(但你最终可能会调用一个刚刚取消订阅的处理程序)

+0

由订阅者来处理刚刚被取消订阅后的情况(无论事件源是否在不消除所有并发的情况下都无法避免)。 – Richard 2010-12-16 14:59:36

0

在一个多线程的世界里,可能的PropertyChanged if语句进行了评估后,被设置为null。

1

这是线程安全的提升事件的方法。通过在使用它之前在本地分配可公开访问的PropertyChanged事件,确保'if'语句和实际引发事件的行之间不会有所不同。

相关问题