簡體   English   中英

發送通知時如何避免丟失接收者?

[英]How to avoid losing receiver when sending notification?

我的程序如何運作

我有幾個帶有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,以便我可以檢查是否為空並將通知作為原子操作發送? 我不想通過反復試驗來執行此操作,因為我可以在每執行1M次執行時找出副作用。

有一種模式可以解決此問題:

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

您可以在事件屬性聲明中攔截事件連線

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM