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

gre*_*man 0 c# events multithreading

我的程序如何工作

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

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

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

错误

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

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

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

现在 - 如何正确锁定PropertyChange,所以我可以检查null并将通知作为原子操作发送?我不想通过反复试验来做到这一点,因为我可以在每次执行第1M次时发现副作用.

Nic*_*ler 5

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

var evt = PropertyChanged;
if ( evt != null ) evt( this, new PropertyChangedEventArgs( name ) );
Run Code Online (Sandbox Code Playgroud)