2009-02-20 99 views
3

说我有一个对象具有子StatusType对象的客户端。两者都实现INotifyPropertyChanged。取消订阅子对象prop更改事件

客户签约的道具在属性检查空,并确保值后改变事件是不同

public StatusType Status 
{ 
    get { return _status ?? (_status = this.GetNewStatusType()); } 
    set 
    { 
     if (!(_status ?? (_status = this.GetNewStatusType())).Equals(value)) 
     { 
      _status.PropertyChanged -= Status_PropertyChanged; 
      _status = value; 
      _status.PropertyChanged += Status_PropertyChanged; 
      base.OnPropertyChanged("Status"); 
     } 
    } 
} 

客户端侦听属性更改事件和气泡起来。

void Status_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    base.OnPropertyChanged("Status." + e.PropertyName); 
} 

客户端和StatusType从EntitiesBase,这确实执行INotifyPropertyChanged的实际繁重继承。

所以我真正的问题是我需要从内存的原因客户退订StatusType.PropertyChanged事件?如果是这样,我应该使用解构器,还是让客户端实现IDisposable?

如果我要使用解构器,它会看起来像这样吗?

~Client() 
{ 
    if (_status != null) 
    { 
     _status.PropertyChanged -= Status_PropertyChanged; 
     _status = null; 
    } 
} 

在此先感谢。在我们的应用程序中,有些时候我们可能在内存中拥有超过1000个客户端,我想确保我的效率。

回答

1

如果这些客户端无限期地保留在内存中并且它们的AppDomain从不卸载,那么您可能会创建内存泄漏。 IDisposable可能是一条更好的路线,因为您将有确定性的方法来清理不再需要的处理程序。

[编辑]请记住,即使您可以从事件的调用列表中删除委托,您将不会释放内存,直到GC运行。您也可能会感兴趣:http://msdn.microsoft.com/en-us/library/aa970850.aspx