是否取消订阅生命周期较短的对象所需的事件?

时间:2013-06-19 12:57:44

标签: c# wpf events event-handling

我有一个视图模型,它从某个服务中检索一个对象,并使其可用于数据绑定。该对象正在实施INotifyPropertyChanged。在视图模型中,当正在修改对象中的某些属性时,我正在监听PropertyChanged事件以执行一些内部操作。

现在可能从服务请求新对象,完全替换旧对象。鉴于生命周期基本上受到视图模型本身的限制,并且没有其他人持有对它的引用(WPF使用弱侦听器),在这种情况下我是否需要取消订阅该对象?当然,我应该并且在设置器中这样做很简单,但我真的需要吗?

public class MyViewModel : INotifyPropertyChanged
{
    private DataType myData;
    public DataType MyData
    {
        get { return myData; }
        protected set
        {
            if (value == myData)
                return;

            if (myData != null)
                myData.PropertyChanged -= DataPropertyChanged;
            myData = value;
            myData.PropertyChanged += DataPropertyChanged;

            OnNotifyPropertyChanged("MyData");
        }
    }

    public void UpdateData ()
    {
        MyData = service.GetData();
    }

    // ...
}

1 个答案:

答案 0 :(得分:1)

你并不真的需要做任何事情,但是当你完成时你应该从事件中分离旧对象。有两个原因。

如果对象被垃圾收集并且事件被触发,那么将花费一些时间来确定对象不再存在。 希望然后将从事件处理程序列表中删除它。如果没有,下一次也将花费更多时间,等等。

更重要的是,如果您的旧对象垃圾收集并且事件被触发,那么您将获得两个事件通知 - 一次在旧对象中一次在新的。你需要专门在旧对象中处理这种情况(否则会发生不好的事情)。

处理此问题的最简单方法是在完成后从事件中分离出来。