【问题标题】:TabControl.Items.Remove(TabItem) does not free memory used by TabItemTabControl.Items.Remove(TabItem) 不会释放 TabItem 使用的内存
【发布时间】:2010-07-02 17:47:50
【问题描述】:

我有一个 WPF 应用程序,当我使用 TabControl.Items.Remove(TabItem)TabControl 关闭 TabItem 时,不会释放 TabItem 使用的内存。它只是使 TabItem 不可见并且 TabItem 对象仍然保留在内存中。有没有办法从内存中删除这个 TabItem 对象?任何帮助将不胜感激。

【问题讨论】:

  • 您在 TabItem 上有事件处理程序吗?
  • 我在这个 TabItem 中有一个 UserControl(TextBoxes+Grids+Graphs+events on these) 作为内容,在这个 TabiItem 上有一个关闭按钮(CloseImage+click 事件)。
  • “TabItem 仍在内存中”是什么意思。你是如何验证的?

标签: .net wpf memory wpf-controls


【解决方案1】:

据我所知,所有事件处理程序都必须“分离”,您还应该释放 tabItem 上的所有绑定。

另外,如果我没有记错 CommandBindings,KeyGestures 也会导致泄漏。

尝试使用 CLR Profiler。尽管我没有将它与 WPF 一起使用,但它已经为我节省了很多时间。但我很确定它可以处理它。

【讨论】:

  • CLR 分析器:microsoft.com/downloads/…
  • 它可以处理。然而,有时获得正确的粒度可能会非常困难。我建议在你完成 repro 之后将它与 SOS/WinDbg 一起使用来获取转储,而不是在分析器下运行,这会完全降低性能。
  • 可以做的另一件事是在删除所有事件处理程序等后调用 GC.Collect,并查看是否收集了对象(当然只是为了调试目的)如果收集了,你有没有泄漏,如果没有 - 你还没有释放一些东西
【解决方案2】:

您需要完全从其父对象中切出一个对象,以便对其进行垃圾回收。这也意味着事件 (-= blah)。

即使这样做了,对象可能仍然在内存中,直到下一次 GC 扫描。

您可以强制调用 GC,但不建议这样做。 http://msdn.microsoft.com/en-us/library/system.gc.aspx

【讨论】:

  • 我有一个 UserControl(TextBoxes+Grids+Graphs+events on these) 作为 TabItem.Content 并且在这个 TabiItem 上有一个关闭按钮(CloseImage+click 事件)。那么我应该剪切哪些事件(TabItem.Content 的事件或 Click 事件放在关闭按钮上)?
  • 我相信点击和删除标签项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2012-03-15
相关资源
最近更新 更多