c# - 取消订阅事件 - 取消订阅或为空?
问题描述
这种方法正确吗?我只想要一个订阅这个事件。当我尝试使用 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;
解决方案
这种方法是否正确......由于某种原因,事件实际上正在增加......
为了防止在引发事件时调用您的事件处理程序,您需要取消订阅该事件。为了帮助防止任何资源泄漏,您应该取消订阅事件,在此处阅读有关此内容的更多信息。
至于您对 , 的评论,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
应该使用。
参考:
推荐阅读
- rxjs - rxjs 中 scan(...) 和 subscribe(...) 的区别
- android - 证书颁发机构不受信任,在 android webview 中但在移动浏览器中工作正常
- android - 如何使用 GoogleMap SDK 列出附近的地点?
- algorithm - 确定分治算法的适当递归函数
- python - 如何用两个 2D 数组 (x,y) 和 0D 数组即标量 (z) 绘制等高线图?
- scala - 如何从 parquet 文件中选择 13 位时间戳列,将其转换为日期并存储为数据框?
- reactjs - 如何修复'动作必须是普通对象。使用自定义中间件进行异步操作。
- c - 格式化打印指针值
- ansible-awx - 如何向 AWX docker 添加回调插件
- c# - 在循环中突然停止的特定路径中创建 (N) 个目录