我应该只使用事件聚合器来防止内存泄漏吗?
本文关键字:内存 泄漏 事件 我应该 | 更新日期: 2023-09-27 18:02:26
我们考虑使用Prism事件聚合器,以减少由于事件引用而导致的内存泄漏。
-
这本身是使用该模式的有效理由吗?其他的好处我们现在不感兴趣了。我们计划在模型组件之间使用它,而不是在UI之间。
-
我们的问题是一些开发人员忘记取消注册事件。我看到Prism有一种使用弱引用的风格,但它有局限性。另一种方法强制显式地Unsubscribe(),这也是可以忽略的。那么如何才能更好呢?
我们的问题是一些开发人员忘记取消注册事件
如果这是您的问题,切换到Prism事件聚合器(或使用任何其他实现)不会改善事情。
在混乱的情况下添加一个新的依赖项和一个新的、不平凡的使用模式,根本不会把它整理好。
你需要的是清理你的代码。
我建议使用静态分析工具,如fxCop(又名code analysis)、Gendarme和NDepend,而不是新的代码库。所有这些都能够检测到事件未解钩或IDisposable未正确实现的某些情况。 使用静态分析,您可以冷静地识别需要清理的代码。使用内存分析器(如dotTrace memory),您将能够找到最严重的违法者并及时清除它们。 更新回答下面评论中的问题:
你建议一个好的模式来确保事件被解除挂钩?
In可能很难确保所有事件都被取消订阅-但考虑到事件实现的方式(参见c#中的CLR了解详细信息),您可以通过确保所有事件订阅被丢弃来欺骗一点。
不是public event EventHandler<Fu> FuBar;
自己处理事件订阅,如下所示:
public event EventHandler<Fu> FuBar {
add { mFuBar += value; }
remove { mFuBar -= value; }
}
private EventHandler<Fu> mFuBar;
然后,在您的类上实现IDisposable
,并在您的Dispose()
方法中将mFuBar
设置为null
,丢弃订阅。然后,FxCop(和其他工具)可以告诉您是否未能处置类。