防止 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 中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
XP 上的 WPF 内存泄漏(CMilChannel,HWND)