You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telerik WPF VirtualGrid VirtualQueryableCollectionView报数组超界错误

故障根因

该错误触发的核心原因有两点:

  1. .NET 运行时对 List<T> 存在硬性容量上限:32位进程下单个List<T>最大支持约1200万个引用类型元素,64位进程下最大容量约为21亿个元素,一旦扩容请求超过该阈值就会抛出「数组维度超出支持范围」异常。
  2. 旧版本 Telerik UI for WPF 的 VirtualQueryableCollectionView 存在设计缺陷:初始化绑定超大数据集时,会尝试给内部维护的占位ObservableCollection一次性申请与总记录数等长的连续内存,加载2亿条记录时的扩容请求直接触发了上述集合容量上限,从堆栈跟踪可以确认异常是在集合异步加载逻辑执行Insert操作触发扩容时抛出的。
修复方案
  • 优先升级Telerik UI for WPF版本:2021 R2及以上版本官方修复了该虚拟集合的容量计算bug,内部对超千万行的数据集采用了分页切片缓存逻辑,不会再一次性申请匹配全量行数的集合容量,实测支持绑定超过10亿行的虚拟数据不触发该异常。
  • 若暂时无法升级版本,不要直接给VirtualQueryableCollectionView.ItemCount赋值2亿的全量行数:初始仅设置100万行的虚拟计数,监听VirtualGrid的滚动事件,当用户滚动位置距离当前已加载末尾不足200行时,每次累加50万的ItemCount值,避免内部集合一次性触发超大容量扩容。
  • 调整项目编译配置:取消Any CPU配置下的「首选32位」勾选,将目标平台固定为x64,避免32位进程下的集合容量上限过低问题。
  • 重写数据加载逻辑:不要将全量IQueryable数据源直接赋值给VirtualQueryableCollectionView.Source,通过处理ItemsLoading事件,每次仅加载当前视窗上下各200行的缓存数据即可,不需要让内部集合持有全量数据的占位对象。

补充验证:小数据量下运行正常是因为总记录数对应的集合扩容申请远低于List<T>的容量阈值,不会触发扩容校验逻辑,和虚拟滚动本身的实现无关。

内容的提问来源于stack exchange,提问作者jsmt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:31:00