在我们的应用程序中,每秒有1K +项流式传输到DataGrid。
我们正在使用Windows社区工具包中的开源UWP DataGrid。它由AdvancedCollectionView支持。这个星座似乎在处理负载方面很挣扎。在具有16 GB RAM和8个逻辑内核的几款现代现代计算机,台式机和笔记本电脑上,结果是相当一致的。
有两点很高兴:
当前,数据网格每秒处理大约一千个新行,但是结果整个窗口UI都比较滞后。当然,数据网格是虚拟的。
有一个后台任务,负责使用CoreDispatcher将新项目添加到AdvancedCollectionView中,以避免跨线程访问UI线程:
await CoreDispaptcher.RunIdleAsync(/* synchronous operation */);
发生以下情况:a)过去了一段时间(例如2秒),或者b)一批元素(例如250个)被批处理; Observable.Buffer(250, TimeSpan.FromSeconds(2))
。
根据添加一批新项目时的建议,使用AdvancedCollectionView.DeferRefresh()
将这些项目添加到AdvancedCollectionView中。
即使UI线程不是真的那么闲置(CoreDispatcher.RunIdleAsync
),IsDispatcherIdle == true
似乎仍然可以运行;
CoreDispatcher
可以清空UI消息队列:
CoreDispatcher.ProcessEvents(CoreProcessEventsOption.ProcessAllIfPresent);
乍一看似乎可以提高性能,但随后在连接调试器的情况下,它总是会引发异常。该文档还指出CoreProcessEventsOption.ProcessAllIfPresent
选项应与DirectX和C ++一起使用。
您看到我们应该采取什么措施或采取其他措施以通过此控件获得更好的流传输性能吗?