【问题标题】:Unsubscribe to child object prop changed events取消订阅子对象属性更改事件
【发布时间】:2010-10-08 22:31:04
【问题描述】:

假设我有一个对象 Client,它有一个子 StatusType 对象。两者都实现了 INotifyPropertyChanged。

客户端在检查null并确保值不同后订阅属性中的prop changed事件

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);
}

Client 和 StatusType 都继承自 EntitiesBase,后者负责实现 INotifyPropertyChanged 的​​实际繁重工作。

所以我的实际问题是,出于内存原因,我是否需要让客户端取消订阅 StatusType.PropertyChanged 事件?如果是这样,我应该使用解构函数,还是让客户端实现 IDisposable?

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

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

提前致谢。在我们的应用程序中,有时我们的内存中可能有超过 1000 个客户端,我想确保我的效率很高。

【问题讨论】:

    标签: c# .net events


    【解决方案1】:

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

    [Edit] 请记住,即使您可以从事件的调用列表中删除委托,您也不会在 GC 运行之前释放内存。

    您也可能对此感兴趣:http://msdn.microsoft.com/en-us/library/aa970850.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多