[英]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.