Незарегистрированные обработчики событий вызывают утечку памяти
Я поддерживаю веб-приложение с утечкой памяти.
Основываясь на моих исследованиях с использованием профилировщика памяти Red Gate ANTS, я почти уверен, что утечка памяти вызвана обработчиками событий на бизнес-уровне.
Существует коллекция, которая регистрирует обработчик событий для каждого добавляемого элемента, чтобы коллекция могла пересортироваться при изменении даты элемента. Похоже, этот обработчик событий является виновником.
Бизнес-уровень для этого приложения довольно сложный, поэтому хранение коллекции и ее элементов в памяти тащит с собой кучу других объектов.
Я реализовал IDisposable в коллекции и удалил обработчики событий в методе Dispose:
p.OnPunchDateChanged -= this.OnPunchDateChanged;
Однако реализация IDisposable не помогает, так как я не могу обернуть все ссылки на коллекцию в блоки use или try / catch. Эта коллекция используется частями приложения, которые я не контролирую.
Как я могу очистить эти обработчики событий, чтобы устранить эту утечку памяти?
2 ответа
Прежде всего, просто чтобы доказать это, попробуйте записать добавление и удаление событий в простой текстовый файл. Затем проверьте, сколько было добавлено и удалено.
Похоже, что где-то в бизнес-логике есть ошибка, которая не отменяет регистрацию события при любых обстоятельствах.
Метод Dispose для коллекции должен вызываться непосредственно вашим кодом, поскольку событие содержит ссылку на коллекцию. Ваша коллекция никогда не будет уничтожена сборщиком мусора.
Вам также следует изменить поведение методов Remove и Clean коллекции, чтобы отсоединить обработчик событий от удаленных элементов.