使用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,但必须是一个实例。
我无法理解发生了什么。有什么想法吗?
编辑: 我理解我的陈述解释的问题是链接: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
答案 0 :(得分:3)
有关可能对您有帮助的答案,请参阅my question here。
我遇到了类似情况,最后使用了自定义界面,比如ICleanup
,而不是IDisposable
,以避免让MEF保留对我的观点的引用。
我认为这是MEF设计中的一个非常大的缺陷。我认为他们至少会让每个部分自行决定是否应该通过使用某个属性或通过实现接口来保留对它的引用......