在ViewModel中使用IDisposable进行内存泄漏,为什么?

时间:2012-02-07 10:49:09

标签: wpf memory prism mef dispose

使用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,但必​​须是一个实例。

enter image description here

我无法理解发生了什么。有什么想法吗?

编辑: 我理解我的陈述解释的问题是链接: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

1 个答案:

答案 0 :(得分:3)

有关可能对您有帮助的答案,请参阅my question here

我遇到了类似情况,最后使用了自定义界面,比如ICleanup,而不是IDisposable,以避免让MEF保留对我的观点的引用。

我认为这是MEF设计中的一个非常大的缺陷。我认为他们至少会让每个部分自行决定是否应该通过使用某个属性或通过实现接口来保留对它的引用......