WPF应用程序内存泄漏

WPF应用程序内存泄漏,wpf,memory,memory-leaks,Wpf,Memory,Memory Leaks,在WPF应用程序中执行某些操作(按下启动一系列计算的按钮)后,每次按下按钮后,大约10 MB的内存泄漏发生((在任务管理器的vm大小部分中可见) 计算顺序不包含错误。 使用内存探查器(.NET内存探查器)表明.NET中不存在泄漏,但每次按下按钮后,名称/资源部分(标记为HeapMemory)中显示的内存大小大约增加10 MB 我读过关于WPF泄漏的帖子,但这些都不是我的情况 有什么不对劲?有什么建议吗?也许,有人也有同样的问题?也许您需要使用安全带来避免泄漏 侦听事件可能导致内存泄漏。侦听事件的

在WPF应用程序中执行某些操作(按下启动一系列计算的按钮)后,每次按下按钮后,大约10 MB的内存泄漏发生((在任务管理器的vm大小部分中可见)

计算顺序不包含错误。

使用内存探查器(
.NET内存探查器
)表明.NET中不存在泄漏,但每次按下按钮后,名称/资源部分(标记为HeapMemory)中显示的内存大小大约增加10 MB

我读过关于WPF泄漏的帖子,但这些都不是我的情况


有什么不对劲?有什么建议吗?也许,有人也有同样的问题?

也许您需要使用安全带来避免泄漏

侦听事件可能导致内存泄漏。侦听事件的典型技术是使用特定于语言的语法,将处理程序附加到源上的事件。例如,在C#中,语法是:
source.SomeEvent+=newsomeeventhandler(MyEventHandler)

此技术创建从事件源到事件侦听器的强引用。通常,为侦听器附加事件处理程序会导致侦听器具有受源对象生存期影响的对象生存期(除非显式删除事件处理程序)。但在某些情况下,您可能希望侦听器的对象生存期仅由其他因素控制,例如它当前是否属于应用程序的可视树,而不是由源的生存期控制只要源对象生存期超过侦听器的对象生存期,正常事件模式就会导致内存泄漏:侦听器的活动时间比预期的长。


(我的重点是。)

在.NET中,看到已用内存的增加对于检测内存泄漏来说是一个误称

然而,在WPF中很容易发生内存泄漏。我建议使用一个稍微更直观的工具,比如(14天免费试用)。使用此方法测试泄漏:

  • 按下按钮一次(用完所有可能的热身)
  • 拍快照
  • 再按一下按钮
  • 拍快照
  • 当您转到“类列表”并检查“从当前快照显示:仅新对象”的过滤器时。这会让你更好地了解你是否有永远不会被释放的对象

    Ants Memory Profiler的另一个特点是,它到处都有视频链接,指导您如何查找漏洞。追踪泄密有点像黑魔法,能得到帮助很好


    不,我不为Redgate工作:)

    我可以通过在“精简”位置插入来修复WPF应用程序内存泄漏问题


    希望这有帮助

    问题:Re Sharper提供使用另一种语法,如source.SomeEvent+=MyEventHandler。它是否也正确?@Peretz:此语法与引用文本中的语法具有相同的语义。我相信是在C#2.0中语法被简化了。ReSharper擅长建议更改,以删除源代码中多余的内容。也许你必须看看这里,发现内存泄漏是一场噩梦,但Ants内存分析器确实帮了大忙。我建议也读一些关于垃圾收集器的书。