Telerik WPF VirtualGrid VirtualQueryableCollectionView报数组超界错误
故障根因
该错误触发的核心原因有两点:
- .NET 运行时对
List<T>存在硬性容量上限:32位进程下单个List<T>最大支持约1200万个引用类型元素,64位进程下最大容量约为21亿个元素,一旦扩容请求超过该阈值就会抛出「数组维度超出支持范围」异常。 - 旧版本 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
相关产品推荐
相关产品推荐

