c# - 对于生命周期较短的对象,是否需要取消订阅事件?

标签 c# wpf events event-handling

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

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

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

    // ...
}

最佳答案

您实际上不需要做任何事情,但您应该在完成后从事件中分离旧对象。有两个原因。

如果对象被垃圾回收并触发了事件,则需要花费一些时间来确定对象不再存在。 希望 然后它将从事件处理程序列表中删除。如果没有,下次也将花费更多时间,依此类推。

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

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

关于c# - 对于生命周期较短的对象,是否需要取消订阅事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17191806/

相关文章:

c# - 如何在列表框中设置文本 block 的背景颜色?

c# - XAML 中的基本数学运算

c# - 以编程方式对 wpf 数据网格进行排序

events - "Ext.mixin.Observable#addEvents"在 Extjs 5/6 中已弃用

C# MailKit HTML 电子邮件以纯文本形式接收

javascript - 将数组从代码隐藏例程传递到 javascript

C# 应用程序从 dll 调用方法时会阻塞

c# - 如何在 Windows 窗体应用程序中实现控件验证?

wpf - 鼠标单击并拖动事件 WPF

c# - 问题为元素 'ImageParameters' 不能包含子元素 'ImageParameter'