【发布时间】:2014-01-02 02:06:02
【问题描述】:
我的 WPF 项目有一个选项卡控件,它承载多个数据网格控件。每个数据网格包含大约 1000 行,预计用户会同时打开 10 个以上的数据网格(每个数据网格都托管在不同的标签页中)。
问题是由于内存不足异常,我的应用程序会在第 5 - 6 个数据网格处崩溃。经过数小时的研究,我发现解决此问题的唯一可行方法是启用 UI 虚拟化。但是,这不是一个选项,因为我需要为我的数据网格平滑滚动,并且启用 UI 虚拟化会禁用平滑滚动。
另一个解决方案是将滚动单元更改为像素而不是基于项目。然而,在我的情况下,这也不是一个选项,因为我被限制在 .NET Framework 4.0 中运行应用程序(该功能仅在 4.5 中可用)。
此外,我很确定是行导致了内存问题,因为如果我在没有数据网格的情况下运行应用程序,我可以轻松加载多达 100 个视图模型。
我在想的是,我是否可以临时处置在不可见标签页中创建的控件,并仅在用户导航到相应的标签页时才创建它们?还有其他方法可以解决这个问题吗?
【问题讨论】:
-
IIRC 虚拟化不应该阻止平滑滚动,实际上它应该改善滚动,因为相同的 UI 元素被回收,这大大减轻了工作量。
-
我认为最好的实现方法是在选项卡 Active/Deactive 上加载和卸载网格。为什么要一次性加载所有网格。
-
既然你已经取消了虚拟化的资格,除了改变 ui 的工作方式之外,没有什么可以做的。如果这确实导致内存不足异常(而不是句柄泄漏),请开始分析使用最多内存的内容 - UI 或数据对象。数据对象是否引用了可以变得惰性的其他对象?还有一件事——你说的是 ViewModel……是每个数据行一个还是每个数据上下文一个?
-
我很确定是 UI 导致了内存问题。它是每个数据网格一个数据上下文/虚拟机,并且虚拟机没有很多嵌套的子节点,所以我怀疑数据对象是原因。
标签: c# wpf datagrid memory-leaks