Я анализирую проект VB.NET, и есть некоторые объекты (дочерняя MDI форма), которые удаляются, но не удаляются GC .
Анализ MemoryProfiler обнаружил, среди прочего, следующее:
"Этот экземпляр утилизирован и все еще
косвенно укорененный EventHandler.
Это часто указывает на то, что
EventHandler не был должным образом
удалены и является частой причиной
утечки памяти. Примеры ниже
непосредственно укоренены EventHandler (s).
Исследуйте их, чтобы получить больше
информация об этой проблеме ... "
Теперь я пытаюсь понять, что это должно значить и как это исправить.
У меня есть форма MDI и дочерняя форма. Дочерняя форма не собирается GC после открытия / закрытия, по-видимому, потому что она все еще (косвенно?) Ссылается на MDIForm EventHandlerList
...
Что это может быть и как мне это исправить?
Я попробовал исправление, рекомендованное в этой теме , потому что была проблема со ссылкой MDI в PropertyStore
, теперь это устранено, но появилась ссылка MDI EventHandlerList
на дочернюю форму .
После некоторого анализа кода я заметил
AddHandler newMenu.Click, AddressOf ClickMenu
без предшествующего с RemoveHandler newMenu.Click, AddressOf ClickMenu
. Может ли это быть основной причиной?
И, предложение, это Handles
Private Sub ClickMenu(sender as Object, e as EventArgs) Handles newMenu.Click
лучше, чем
RemoveHandler newMenu.Click, AddressOf ClickMenu
AddHandler newMenu.Click, AddressOf ClickMenu
с точки зрения выделения памяти?