我应该只使用事件聚合器来防止内存泄漏吗?

本文关键字:内存 泄漏 事件 我应该 | 更新日期: 2023-09-27 18:02:26

我们考虑使用Prism事件聚合器,以减少由于事件引用而导致的内存泄漏。

  1. 这本身是使用该模式的有效理由吗?其他的好处我们现在不感兴趣了。我们计划在模型组件之间使用它,而不是在UI之间。

  2. 我们的问题是一些开发人员忘记取消注册事件。我看到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(和其他工具)可以告诉您是否未能处置类。