防止 WPF 中的内存泄漏

Posted

技术标签:

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

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

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

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

【问题讨论】:

每个实现 IDisposable 的类(无论是 WinForms、WPF 还是其他任何东西)都应该被相应地处理......并且事件处理程序(即使是非 UI 实例)也必须被处理。 .. 你用的是 deleaker 还是 valgrind? 类似问题 - ***.com/questions/6154810/memory-leaks-in-wpf-c-sharp 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

.....

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

【讨论】:

【参考方案3】:

一些关于 WPF 资源字典泄漏的有用链接:

DynamicResource\StaticResource cause memory leaks Memory leak problem with ResourceDictionary and MergedDictionaries

【讨论】:

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

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

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

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

【讨论】:

以上是关于防止 WPF 中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

如何防止java中的内存泄漏

防止 Angular 2 中的内存泄漏?

XP 上的 WPF 内存泄漏(CMilChannel,HWND)

如何防止 node.js 中的内存泄漏?

如何防止 JTextPane.setCaretPosition(int) 中的内存泄漏?

WPF 内存泄漏优化经历