【问题标题】:Prevent memory leaks in WPF防止 WPF 中的内存泄漏
【发布时间】:2011-12-05 22:17:45
【问题描述】:

使用WinForms,您必须在使用 gdi 对象、事件处理程序、来自本机代码的对象等之后释放内存。

在 WinForms 中,我曾经在 dispose 方法中删除例如事件处理程序。

防止Wpf 中的内存泄漏的最佳解决方法是什么?和Winforms 中使用Dispose pattern 一样吗?我是否必须关心Wpf 中的事件处理程序、gdi 对象?运行时创建的资源(Brushes等)呢?

【问题讨论】:

  • 每个实现 IDisposable 的类(无论是 WinForms、WPF 还是其他任何东西)都应该被相应地处理......并且事件处理程序(即使是非 UI 实例)也必须被处理。 ..
  • 你用的是 deleaker 还是 valgrind?

标签: c# wpf memory-leaks


【解决方案1】:

This 博客文章列出了导致 WPF 应用程序内存泄漏的最常见情况。

  • 父窗口中对象的事件处理程序
  • 从静态对象注册事件
  • 使用计时器
  • 数据绑定
  • 更改文本框的 Text 属性

它还描述了如何解决这些常见问题。

另一种好方法是在遵循标准指南的同时开发应用程序,然后使用某种分析器来确定任何内存泄漏或性能瓶颈。

【讨论】:

    【解决方案2】:

    来自MSDN:任何 WPF 框架级元素(那些从 FrameworkElement 或 FrameworkContentElement 派生的对象)都具有三个常见的生命周期事件:Initialized、Loaded 和 Unloaded。

    .....

    Unloaded 最后引发并由演示源或被删除的可视父级启动。当 Unloaded 被引发和处理时,作为事件源父元素(由 Parent 属性确定)或逻辑或可视树中向上的任何给定元素可能已经取消设置,这意味着数据绑定、资源引用和样式可能不设置为其正常或最后已知的运行时值。

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 抱歉,这是一个旧链接,可能已被删除。不过,搜索惰性水合资源和 WPF 可能会得到一些不错的结果。
      【解决方案4】:

      注意事件:很容易错过一些东西,因为来自委托的所有引用都将存在,直到委托存在。我建议尽可能使用弱事件模式。实际上,微软在他们的 Prism 框架中使用了它。

      http://msdn.microsoft.com/en-us/library/aa970850.aspx

      另外看看我在学习WPF时被多次抓到的一个问题http://support.microsoft.com/kb/938416/en-us

      【讨论】:

        猜你喜欢
        • 2010-09-21
        • 2016-07-10
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 2016-03-31
        相关资源
        最近更新 更多