Первое, на что нужно обратить внимание, когда вы пытаетесь обнаружить утечки памяти в приложении .NET, WPF или нет, это объекты, которые подписываются на события.
Если объект X прослушивает событие, вызванное объектом Y, тогда Y содержит ссылку на X. Какой бы метод виртуализации (или удаления) вы ни внедрили, если X не отписывается от события Y, X останется в объекте График, пока Y делает, и никогда не будет завершен и сборщик мусора. (Даже если он реализует IDisposable
и вы явно вызываете Dispose
для него.)
Когда вы говорите «закрытие формы не помогает», это вызывает у меня двойное подозрение: я ожидаю, что кто-то реализовал свойство объекта для объекта Window
, и этот объект подписался на какое-то событие. Таким образом, вы закрываете окно, но оно все еще существует в графе объектов, поскольку на одно из его свойств ссылаются.
(Чтобы дать вам представление о том, насколько коварным это может быть: элементы управления WinForms ToolStrip
подписываются на события изменения темы Windows, когда они становятся видимыми. Это замечательно, потому что изменение темы вашего компьютера автоматически отражается в пользовательском интерфейсе вашего Запуск приложения. Это не так здорово, если вы разыменуете ToolStrip
без предварительной установки Visible
в false, оно будет продолжать получать события смены темы, пока приложение не завершится.)
Профилировщик памяти может помочь с этим - вот как я обнаружил, что мое приложение имеет в памяти тысячи ToolStrip
объектов, хотя я думал, что все они были уничтожены.