Убедитесь, что вы не сохраняете никаких ссылок на ваше окно, даже косвенных. Одной из наиболее распространенных причин утечек являются события. Если окно B добавляет обработчик события к событию окна A, B не будет освобожден до тех пор, пока не будет также A.
Например, если вы напрямую слушаете изменения свойств, вам следует использовать шаблон слабых событий и заменить все ваши + = вызовом PropertyChangedEventManager .AddListener. В общем, каждый сильный обработчик, который вы добавляете в событие, должен быть удален, чтобы избежать утечки.
Подробнее о утечках в .NET в этой статье MSDN .
Вы можете использовать профилировщик памяти, такой как мем-профилировщик Scitech или Jetbrains dotTrace, чтобы увидеть, какие объекты хранят ваши окна в памяти.
Редактировать: В ответ на ваши комментарии ваш случай действительно проще, чем я думал: сборщик мусора просто еще не собрал окно. Добавление GC.Collect
к Test_Click
в целях тестирования решает проблему.
Здесь удалите событие SelectionChanged
из ComboBox
, когда форма закрывается, чтобы вы могли позволить GC выполнить свою работу и вернуть форму позже без проблем. Если вам действительно нужна вся форма для выпуска прямо сейчас, вы можете позвонить по номеру GC.Collect
, хотя вам следует избегать ее, когда это возможно.
Редактировать 2: В ответ на ваш третий комментарий это должно иметь значение только для объектов, которые являются общими для представлений, и где изменения в представлении изменят что-то обратно в общем объекте. В вашем тестовом проекте SelectionChanged
ничего не делает в исходном списке, поэтому не имеет значения, было ли событие инициировано или нет. Форма будет собрана в конце концов.