RemoveHandlers на базовой форме - PullRequest
       25

RemoveHandlers на базовой форме

0 голосов
/ 08 февраля 2010

Интересно, смогу ли я удалить все добавленные обработчики событий в всех дочерних формах из одной базовой формы в методе Closing. (VB.NET; .NET 2.0)

Справочная информация: В проекте я анализирую проблему с памятью. Я проверил с помощью профиля памяти (см. связанный вопрос ) и выяснил, что некоторые формы не собираются GC, возможно, из-за не удаленных ссылок EventHandler.

В проекте все формы наследуются от BaseForm. Теперь я ищу способ удалить в методе OnClosed foreach Control все EventHandlers в / из ChildForms.

Это возможно?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2010

Нет, Windows Forms делает это явно очень трудным для выполнения. Он использует методы добавления и удаления события, сохраняя делегат обработчика события в списке. Единственный документированный способ удалить обработчик из этого списка - это использовать RemoveHandler, предоставляя точно такой же аргумент AddressOf. Выделение списка технически возможно с помощью Reflection, вам сначала нужно найти секретный «cookie», который используется для идентификации события в списке. Вам нужно будет использовать Reflector или Reference Source, чтобы найти имя файла cookie.

Просмотрите это сообщение на форуме для возможной причины, по которой MenuItem вызывает утечки.

1 голос
/ 08 февраля 2010

Ну, вы можете использовать Reflection, чтобы найти все события. Но я думаю, что нет способа перечислить обработчики, назначенные событию. Добавлены и удалены средства доступа только для свойств события.

...