wpf - ViewModel 中 IDisposable 内存泄漏,为什么?

标签 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 实例不会被销毁,并且存在内存泄漏。如果删除接口(interface)及其方法IDisposable,则View和ViewModel删除成功。

我使用 ANTS 内存分析器。在下一张图中,您可以看到来自 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

最佳答案

参见my question here寻找可能对您有帮助的答案。

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

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

关于wpf - ViewModel 中 IDisposable 内存泄漏,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9174898/

相关文章:

c# - 将 SignalR 用于桌面应用程序是否正确?

wpf - 为什么 CompositionTarget.Rendering 采用 EventArgs 而不是 RenderingEventArgs?

wpf - 如何将按钮名称绑定(bind)到内容?

android - 为什么图像由android :src in xml remain stored in heap?设置

java - 在 eclipse.ini 中定义 --launcher.XXMaxPermSize 后,Eclipse 无法创建 JVM

wpf - 在带有 Prism 的 MVVM 应用程序中使用 DB4O

wpf - WPF ComboBox DropDown部分出现在错误的位置

java - 我的应用程序有 128MB 堆,但使用 1.6GB 实际 RAM。我怎样才能找到 1.4GB 的去向?

log4net - Prism 2.1 : Accessing the IOC Container from App. xaml?

.net - 推荐的 Prism v2 Silverlight/WPF 项目结构