Использование C #, WPF, MVVM, Prism, MEF.
Мне нужны внешние эффекты (у меня это из View называется Dispose ()), чтобы освободить ресурсы в ViewModel, используемые в View.
Я использую что-то вроде следующего кода:
public class MyViewModel: IDisposable, IMyViewModel, ...
{
private bool disposed = false;
private System.Timers.Timer timer;
public MyViewModel()
{
timer = new System.Timers.Timer();
timer.Interval = 100;
//timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Start();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!this.disposed)
{
if(disposing)
{
// Dispose managed resources.
timer.Dispose();
timer = null;
//GC.KeepAlive(timer);
//GC.Collect();
}
disposed = true;
}
}
~MyViewModel()
{
Dispose(false);
}
}
Таким образом, экземпляры View и ViewModel не уничтожаются и возникает утечка памяти. Если вы удаляете интерфейс и его методы IDisposable, View и ViewModel удаляются успешно.
Я использую ANTS Memory Profiler. На следующей диаграмме вы видите три экземпляра из DisposableReflecationComposablePart, но они должны быть одним экземпляром.
Я не могу понять, что происходит. Есть идеи?
Edit:
Я понимаю, что мои заявления объясняют проблему по ссылке: http://mef.codeplex.com/wikipage?title=Parts%20Lifetime&referringTitle=Guide
в следующем предложении:
Таким образом, контейнер не будет содержать ссылки на части, которые он создает, если не выполнено одно из следующих действий:
The part is marked as Shared
The part implements IDisposable
One or more imports is configured to allow recomposition