Незарегистрированные обработчики событий вызывают утечку памяти - PullRequest
9 голосов
/ 15 января 2009

Я поддерживаю веб-приложение с утечкой памяти.

Основываясь на результатах моего исследования с использованием профилировщика памяти Red Gate ANTS, я уверен, что утечка памяти вызвана обработчиками событий на бизнес-уровне.

Существует коллекция, которая регистрирует обработчик событий для каждого добавляемого элемента, чтобы коллекция могла пересортироваться при изменении даты элемента. Похоже, что этот обработчик событий является виновником.

Бизнес-уровень для этого приложения довольно сложен, поэтому сохранение коллекции и ее элементов в памяти перетаскивает вместе с ней кучу других объектов.

Я реализовал IDisposable в коллекции и удалил обработчики событий в методе Dispose:

p.OnPunchDateChanged -= this.OnPunchDateChanged;

Однако реализация IDisposable не помогает, так как я не могу обернуть все ссылки на коллекцию в блоки использования или try / catch. Эта коллекция используется частями приложения, которые я не могу контролировать.

Как очистить эти обработчики событий, чтобы устранить утечку памяти?

Ответы [ 2 ]

4 голосов
/ 15 января 2009

Прежде всего, просто чтобы доказать свою точку зрения, попробуйте записать добавление и удаление событий в простой текстовый файл. Затем проверьте, сколько было добавлено и удалено.

Звучит так, как будто где-то в бизнес-логике есть ошибка, которая не отменяет регистрацию события при любых обстоятельствах.

1 голос
/ 18 марта 2010

Метод Dispose для коллекции должен вызываться непосредственно вашим кодом, поскольку событие содержит ссылку на коллекцию. Ваша коллекция никогда не будет уничтожена сборщиком мусора.

Также следует изменить поведение методов Remove и Clean для коллекции, чтобы отсоединить обработчик событий от удаленных элементов.

...