9

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

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

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

此应用程序的业务层相当复杂,因此将集合及其项保存在内存中会拖累一堆其他对象。

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

p.OnPunchDateChanged -= this.OnPunchDateChanged;

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

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

4

2 回答 2

4

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

听起来好像业务逻辑中的某个地方存在一个错误,在所有情况下都没有取消注册事件。

于 2009-01-15T20:01:39.097 回答
1

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

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

于 2010-03-18T14:55:28.290 回答