WPF的TreeView导致内存泄漏和性能问题

时间:2011-12-29 17:20:42

标签: wpf performance memory treeview memory-leaks

我遇到了WPF TreeView控件的问题。 我想我遇到了这个控件的内存泄漏问题以及一些性能问题。 我已经准备了一个简单的演示解决方案,您可以在其中看到这些问题。 下载链接:http://www.custom-projects.com/TreeViewMemoryAndPerformanceIssue.zip

我根据一些域对象创建树。对象包含在视图模型中。 级别数量不受限制,但目前我们最多有3个级别。

因此,每个视图模型都可以有子项。

当您单击UpDown控件的向上/向下按钮并且不释放鼠标按钮时,您将看到int值的更新速度将变得越来越慢并且内存消耗不断增加。

我正在做什么:当您单击向上/向下按钮时,该值将通过数据绑定发送到视图模型。在制定者中我举起了一个活动。我们的应用程序由不同的视图模型组成,如果有人在其中一个中更改数据,则其他人会通过这些DataChanged事件得到通知。

为简单起见,我的演示解决方案只包含NavigationViewModel。所以它听 对于DataChanged事件,如果触发,则呈现树。

因为我们没有一个总是相同的列表(只添加或删除了行),所以我没有使用ObservableCollection。我们总是必须根据用户添加/创建的对象重新生成列表。

无论如何,我将这些视图模型添加到列表中并引发NotifyPropertyChanged事件 以便WPF更新树。运行良好但列表更新越多,应用程序获得的速度就越慢(内存也会增加)。

我检查过,项目视图模型是垃圾收集的,它们是,所以我不明白 我身上有些不对劲。我也做了一些性能分析。看起来,那个 问题是在WPF方面,因为我的代码没有减慢速度。 Application.Run方法 执行时间上升...奇怪的是。

有没有人有一个想法,为什么内存会上升,永远不会被释放,为什么会这样 性能开始降低TreeView更新自己的频率越高?

感谢您对此问题的任何帮助或评论。

谢谢, 基督教

2 个答案:

答案 0 :(得分:1)

我使用ANTS Memory Profiler对您的测试应用程序进行了分析,您可以看到您的类“NavigationItemBaseViewModel”和数组“NavigationItemBaseViewModel []”仍然通过引用保存在内存中,并且每次增量都会变得更糟。

如果慢慢增加并允许更新发生,则引用将被破坏并且对象被丢弃。都好。 但是,如果快速/连续递增,则会看到引用未被破坏,因此数组将保留在内存中。

每次增量都会变慢,因为你的应用程序必须更新很多这些视图模型,增量#58我有172个数组,它们之间有517个NavigationItemBaseViewModel。 在“普通”功能的情况下,您只有4个阵列和13个NavigationItemBaseViewModel。

希望有所帮助,如果您无法弄清楚新创建新数组的逻辑,我建议您分析一下内存。通常最好重复使用数组。

我使用的Profiler在这里:http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/index2

希望有所帮助。

答案 1 :(得分:0)

我正在调查WPF中的大量内存泄漏,我觉得这个工具非常有用:http://www.jetbrains.com/profiler/它的试用期为10天(我刚检查过)所以我希望你能找到你的问题