【问题标题】:MVVM-WPF: Dynamic view and memory leak?MVVM-WPF:动态视图和内存泄漏?
【发布时间】:2012-05-11 13:03:44
【问题描述】:

我有一个长期存在的 ViewModel 和一个动态 View,只要用户想要查看 ViewModel,它就会添加到可视化树中。当用户关闭视图时,它会从可视化树中移除。我故意将 50mb 的虚拟数据放在 View(UserControl) 中:

private byte[] data = new byte[50 * 1024 * 1024];

当我将视图添加到可视化树时,我看到 Process Explorer 内存猛增。我关闭了视图(从可视化树中卸载它),然后显式调用了垃圾收集方法:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

但是,内存并没有减少,每当我将视图添加到可视化树时,都会再添加 50mb。我确定我的 ViewModel 没有引用视图。

有什么解决这个问题的建议或向我解释为什么会这样?

谢谢!

编辑:

我使用了 dotTrace 内存分析器,发现没有来自 ViewModel 的引用。所有对“数据”变量的引用都是 UI 对象。其中大部分来自模板。我应该如何正确解决这个问题?

【问题讨论】:

  • 是否有任何附加到 ViewModel 或其他非 UI 对象事件的视图的代码隐藏?
  • 不。只有普通的数据绑定。
  • 如果可能的话,我建议您使用 .NET 内存分析器。它应该给你一个直接的答案是什么导致它没有被收集。
  • 您是否遇到内存不足异常?视图和视图模型是否通过数据模板连接?
  • 你在视图模型中连接了任何事件处理程序(淘气)?这些将使视图保持活动状态。

标签: c# wpf mvvm memory-leaks


【解决方案1】:

未在 UI 中绑定的类上实现 INotifyPropertyChanged 可能会导致内存泄漏。见:http://support.microsoft.com/kb/938416/en-us

【讨论】:

    【解决方案2】:

    试试这个工具,它对我帮助很大。 http://www.jetbrains.com/profiler/(有10天试用期)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2012-04-30
      • 2023-03-25
      • 1970-01-01
      • 2010-12-05
      相关资源
      最近更新 更多