11

应用:

  • WPF 应用程序由顶部的文本框和下方的列表框组成
  • 用户在TextBox中输入字符串查找员工,搜索结果显示在ListBox中
  • ListBox 使用 DataTemplates 来显示元素(显示员工姓名、部门、​​电话和缩略图。)

执行:

  • 在应用程序启动时,我查询数据库并检索要显示在 ListBox 中的所有员工和相关信息。这一直保存在内存中。
  • 应用程序启动后,所有可搜索的数据都在内存中,搜索几乎是即时的。所有搜索都在内存中的数据上执行。
  • 搜索结果使用 DataTemplates 显示在 ListBox 中。缩略图、姓名、电话、部门等显示在每个 ListBox 项中。

问题:

  • 启动时内存使用量约为 200MB。
  • 随着列表框中的数据发生变化,无论是通过新搜索还是简单地向下滚动列表框,内存消耗都会增加。
  • 当用户缓慢向下滚动列表框时,内存增加得更快。当您上下滚动时,内存迅速达到 1GB。

没有手动创建控件的代码 - 一切都是通过数据绑定完成的。

为什么我会看到这种行为?我能做些什么来修复它?请帮忙!

更新:我发现问题不是内存泄漏。这里的问题是列表框正在创建对象以显示员工的图像,并且在列表框项离开窗口后没有为垃圾收集器释放。CleanUpVirtualizedItem 事件如我所料发生,但内存仍未释放。有任何想法吗?

4

5 回答 5

8

冒着油嘴滑舌的风险,你有内存泄漏。为什么不尝试使用像ANTS * 这样的工具来追踪它。他们有免费试用版,我从未使用过它,但它有很好的声誉。

*其他分析工具可用。

如果您不想使用其他工具,您可以尝试在每次创建类时增加静态成员并在每次处置实例时减少它。这将帮助您追踪未正确销毁的实例。

于 2009-05-08T20:26:03.937 回答
3

你可以使用

WPF 性能套件

优化 WPF 应用程序性能

一个类似的问题困扰着我.. (类似)

在应用程序启动时,我查询数据库并检索要显示在 ListBox 中的所有员工和相关信息。这一直保存在内存中。

也许您可以修改您的代码以遵循WPF:数据虚拟化

于 2009-05-14T09:43:25.923 回答
1

它似乎真的是内存泄漏。可能,DataTemplate 中的一些 UI 元素保留对其他对象的引用,即使 UI 元素被销毁,这些对象也应该保持活动状态。

图像控件可能存在一些内存泄漏。尝试从模板中删除它并查看结果。另外,您是否订阅了控件加载事件或类似事件中的任何事件?

不过只是一些猜测......正如人们在这里所说的那样,您可能真的想用性能和内存分析器来查看您的应用程序。

于 2009-05-15T16:21:32.590 回答
0

我注意到在看似无害的情况下,WPF 和 .NET 3.5 SP1 内存问题存在一些问题。

我确实找到了一些资源,但我不确定它们是否会对您有所帮助:

http://blog.ramondeklein.nl/?p=58

那篇博客文章描述了一种情况,当

  1. 样式在应用程序的 ResourceDictionary 中定义。
  2. 该样式使用使用媒体效果(即 DropShadowEffect)的控件模板。
  3. 应该使用 StaticResource 引用媒体效果

简而言之,我认为您的解决方案是确保任何媒体效果(投影等)都使用静态资源。

于 2009-05-12T18:46:10.020 回答
0

对我帮助很大的一件事是使用包装 Stream 类的类。这在这里详细解释,果然我使用这种方法节省了很多内存。WPF 确实保留了对每张图片的底层 byte[] 和流的引用。

于 2009-05-21T20:59:10.537 回答