代码之家  ›  专栏  ›  技术社区  ›  Joseph Anderson

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

  •  9
  • Joseph Anderson  · 技术社区  · 17 年前

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

    根据我使用红门蚂蚁内存分析器的调查,我确信内存泄漏是由业务层的事件处理程序引起的。

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

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

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

    p.OnPunchDateChanged -= this.OnPunchDateChanged;
    

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

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

    2 回复  |  直到 16 年前
        1
  •  4
  •   Simon Hughes    17 年前

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

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

        2
  •  1
  •   munissor    16 年前

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

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

    推荐文章