首页 > 解决方案 > 取消订阅事件 - 取消订阅或为空?

问题描述

这种方法正确吗?我只想要一个订阅这个事件。当我尝试使用 unsubscription -= 时,由于某种原因,事件实际上正在添加,并且每次都更多。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;

标签: c#wpf

解决方案


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

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

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

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

考虑到这一切,这-=是一个事件的正确方式,unsubscribing应该使用。

参考:

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

我应该退订活动吗


推荐阅读