繁体   English   中英

取消订阅事件 - 取消订阅或为空?

[英]Unsubscribing from events - unsubscription or null?

这种方法是否正确? 我只想订阅此事件。 当我尝试使用取消订阅 -= 时,由于某种原因,事件实际上正在添加,并且每次都是更多。关闭关联窗口时不会处理 PresentationViewModel,因此这次我不能依赖 IDisposable 但它已实现并且事件也在那里处理 -也许是矫枉过正。

我想知道分配 null 是否会带来我可能不想要的任何副作用。

谢谢你。

public PresentationViewModel ViewModel
{
    get
    {
        if (_viewModel != null) return _viewModel;

        _viewModel = (PresentationViewModel) DataContext;
        _viewModel.OnNavigatedToHandler = null; // <-------------------
        _viewModel.OnNavigatedToHandler += OnNavigatedToHandler;
        _viewModel.OnNavigatedFromHandler = null; // <-------------------
        _viewModel.OnNavigatedFromHandler += OnNavigatedFromHandler;

        return _viewModel;
    }
}

之前我以这种方式添加了取消订阅,导致多次调用此方法:

_viewModel.OnNavigatedToHandler -= OnNavigatedToHandler;
_viewModel.OnNavigatedToHandler += OnNavigatedToHandler;
_viewModel.OnNavigatedFromHandler -= OnNavigatedFromHandler;
_viewModel.OnNavigatedFromHandler += OnNavigatedFromHandler;

这种方法是否正确......出于某种原因,事件实际上正在增加......

为了防止在引发事件时调用您的事件处理程序,您需要取消订阅该事件。 为了帮助防止任何资源泄漏,您应该取消订阅事件, 在此处阅读有关此内容的更多信息。

至于您的评论, for some reason events are actually adding ,原因是您没有取消订阅,因此该对象通过此引用保持活动状态。 作为回报,在不取消订阅的情况下执行此操作会造成内存泄漏。

正如评论中已经提到的,不要将null分配给事件,因为"it will unsubscribe ALL handlers, even ones that your code didn't subscribe." 正如马修沃森指出的那样。 Jon Skeet指出, it'll effectively clear the list of subscribers ,这意味着此时不会调用任何处理程序,Matthew Watson 在他的评论中也提到了这一点。

考虑到所有这些, -=unsubscribing事件的正确方法,应该使用。

参考:

如何订阅和取消订阅事件 c#

我应该取消订阅事件吗

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM