gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:58:55 28 4
gpt4 key购买 nike

使用 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 引用我的观点。

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

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com