发送通知时如何避免丢失接收方?

时间:2011-10-13 09:32:15

标签: c# multithreading events

我的节目如何运作

我有几个具有PropetyChanged事件的对象的后端。更改某些属性后,将触发通知。在前端,我有用WPF编写的GUI,并且几个属性直接绑定到WPF小部件。

为了使GUI响应,所有计算都在另外的线程中完成。

所以,一般来说,经典的WPF应用程序。

错误

public void OnPropertyChanged(string name)
{
  if (PropertyChanged != null)
    PropertyChanged(this, new PropertyChangedEventArgs(name)); // (*)
}

此代码发送通知,但它会在(*)处抛出异常,因为PropertyChanged为null(是的,只有 检查null之后)。

问题

我的猜测是因为在WPF中重新绑定 - 在我的代码中我更改了发件人,因此WPF必须取消注册接收者并将其注册到新发件人。很少抛出异常(我每执行约40000次执行一次异常,每次执行大约相当于发送者的一次更改)但确实会发生。

现在 - 如何正确锁定PropertyChange,所以我可以检查null并将通知作为原子操作发送?我不想通过试用&错误,因为我可以在每次执行第1M次时发现副作用。

2 个答案:

答案 0 :(得分:5)

有一种模式可以解决这个问题:

var evt = PropertyChanged;
if ( evt != null ) evt( this, new PropertyChangedEventArgs( name ) );

答案 1 :(得分:1)

您可以在事件属性声明中拦截事件连接

private PropertyChangedEventHandler _propertyChanged;
public PropertyChangedEventHandler PropertyChanged
{
   add 
   { 
     // intercept here
     _propertyChanged += value; 
   }
   remove 
   { 
     // intercept here
     _propertyChanged -= value; 
   }
}