У нас есть приложение WPF, основанное на Unity с шаблоном MMVVVM. В жизненном цикле приложения может быть несколько жизненных циклов проекта, после каждого жизненного цикла проекта мы делаем Tear Down вручную и пытаемся освободить все ссылки на ViewModels. Для подписок на события с Unity мы используем Слабые ссылки. Таким образом, мы предполагаем, что после разрыва мы можем вызвать GC Collect, чтобы все объекты мусора собирались мусором. У нас есть еще один вариант, чтобы вручную отменить подписку на все события, но мы предпочитаем сборку мусора, потому что она очистит около 200 МБ, что облегчит загрузку нового проекта.
В одном случае мы наблюдаем, что, если я вызову GC.Collect только один раз, его ссылка все еще останется в памяти на некоторое время.
GC.Collect();
GC.WaitForPendingFinalizers();
Но если я попытаюсь вызвать GC два раза подряд, он все прекрасно очистит.
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
Любые мысли или указатели будут высоко оценены.
Обновление:
В классе не определены финализаторы.
Теперь я также рассматриваю случай, когда этот объект упоминается в другом объекте, который может иметь финализатор. В нашей среде у нас есть финализатор только для DBProvider, поэтому я не думаю, что даже в этом случае.