Основной причиной «утечек памяти» в приложениях .NET являются обработчики событий. Если объект A обрабатывает событие, вызванное объектом B, объект A может выйти из области видимости, и он не будет уничтожен, потому что даже если ваш код не сохраняет ссылку на него, объект B делает.
В WinForms некоторые объекты пользовательского интерфейса (ToolStripButton
- хороший пример) регистрируются в Windows для обработки событий смены темы. Windows хранит ссылку на них, чтобы они могли сказать им, если пользователь меняет тему. Досадно, что эти объекты не отменяются, если форма, на которой они находятся, закрывается, в результате чего их форма уничтожается, но они этого не делают.
Итак, как, черт возьми вы уничтожаете один из этих объектов? В случае ToolStripButton
установка Visible
на false
делает свое дело. Оказывается, переключение Visible
также переключает, обрабатывает ли элемент управления события смены темы. Поэтому, если вы установите Visible
на false
, элемент управления будет отменен, а затем, когда он выйдет за пределы области видимости, он действительно может быть уничтожен.
Возможно, это поможет с ElementHost
, по той же или по аналогичной причине. Трудно сказать, потому что, как вы обнаружите, если вы изучите эту проблему, она не совсем, вы знаете, задокументирована.