У меня есть приложение WPF, которое позволяет пользователю открывать, закрывать и повторно открывать произвольное количество дочерних окон.
Используя встроенный профилировщик памяти VS2015, я обнаружил, что определенный тип дочернего окна, назовем его ProblematicChildWindow, всегда остается в памяти после закрытия, поэтому его экземпляры складываются в случае частых действий закрытия и повторного открытия. . К сожалению, я не могу воспроизвести проблему в минимальном приложении (там все работает нормально).
Я знаю о частых случаях утечки памяти в WPF и пришел к выводу, что профилировщик ошибается. Поэтому я добавил следующий код в проблемный класс:
~ProblematicChildWindow()
{
using (StreamWriter sw = File.CreateText("d:\\garbagecollection.txt"))
{
sw.WriteLine(DateTime.Now.ToShortTimeString() + " garbage collected.");
}
}
Теперь самое странное:
После открытия и закрытия экземпляра ProblematicChildWindow и принудительной сборки мусора я обнаружил новый файл "garbagecollection.txt" в своей папке D:\, НО
Профилировщик памяти VS2015 сообщает мне, что в памяти все еще есть экземпляр ProblematicChildWindow!
Мой вопрос: учитывая тот факт, что экземпляр явно был собран мусором (потому что был вызван финализатор), могу ли я быть уверен, что занятая память будет освобождена?
В этом случае у профилировщика памяти VS2015, похоже, есть ошибка.
ОБНОВЛЕНИЕ: .NET Memory Profiler сообщает мне, что после закрытия в памяти не осталось ни одного экземпляра. Но VS2015 работает (только что еще раз проверил).
GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
. - person Damien_The_Unbeliever   schedule 05.07.2016