我正在维护一个存在内存泄漏的 Web 应用程序。
根据我使用 Red Gate ANTS 内存分析器的调查,我很确定内存泄漏是由业务层中的事件处理程序引起的。
有一个集合在添加的每个项目上注册一个事件处理程序,以便在项目的日期更改时集合可以重新排序。看来这个事件处理程序是罪魁祸首。
此应用程序的业务层相当复杂,因此将集合及其项保存在内存中会拖累一堆其他对象。
我在集合上实现了 IDisposable 并删除了 Dispose 方法中的事件处理程序:
p.OnPunchDateChanged -= this.OnPunchDateChanged;
但是,实现 IDisposable 并没有帮助,因为我无法在 using 或 try/catch 块中包装对集合的所有引用。此集合由我无法控制的应用程序部分使用。
如何清除这些事件处理程序以解决此内存泄漏?