【问题标题】:WPF Multiple datagrid causing memory issueWPF 多个数据网格导致内存问题
【发布时间】: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


【解决方案1】:

不使用数据网格会有所帮助。

虽然这样的控件使用起来很方便,但事实上它们远非轻量级。

屏幕将一次容纳约 30 行,因此无需使用数千行来污染内存,将更多行加载到某些数据集可以平滑滚动,因为您将向网格提供预取数据,

如果数据不是不断变化,您甚至可以在临时文件中创建离线缓存。

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多