未注册的事件处理程序会导致内存泄漏

时间:2009-01-15 19:50:07

标签: c# asp.net events idisposable red-gate-ants

我正在维护一个内存泄漏的Web应用程序。

基于我使用Red Gate ANTS内存分析器的调查,我非常确定内存泄漏是由业务层中的事件处理程序引起的。

有一个集合在每个添加的项目上注册一个事件处理程序,以便集合可以在项目的日期更改时重新排序。看来这个事件处理程序是罪魁祸首。

此应用程序的业务层非常复杂,因此将集合及其项目保留在内存中会拖拽其他一些对象。

我在集合上实现了IDisposable,并在Dispose方法中删除了事件处理程序:

p.OnPunchDateChanged -= this.OnPunchDateChanged;

然而,实现IDisposable并没有帮助,因为我无法在using或try / catch块中包装对集合的所有引用。此集合由我无法控制的应用程序部分使用。

如何清除这些事件处理程序以解决此内存泄漏?

2 个答案:

答案 0 :(得分:4)

首先,为了证明这一点,请尝试将事件的添加和删除记录到简单的文本文件中。然后,检查添加的数量与删除的数量。

听起来好像业务逻辑中某处存在一个错误,在任何情况下都不会注销事件。

答案 1 :(得分:1)

集合中的Dispose方法应该由代码直接调用,因为该事件包含对集合的引用。垃圾收集器永远不会销毁您的收藏品。

您还应该更改集合的Remove和Clean方法的行为,以便从已删除的项目中分离事件处理程序。