У нас есть приложение 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, поэтому я не думаю, что даже это так.