我希望能够快速将项目添加到数据网格,而不会导致UI延迟。
以下是我现在正在做的事情: 我正在使用绑定到数据网格的ObservableCollection。
我使用后台线程,只有在从observable集合中插入/删除时,才会在当前调度程序上循环并调用Invoke。调用BeginInvoke会产生不良结果。
我知道在调度员上调用那么多导致延迟,但我不知道还能做什么。我之前使用过背景工作者,但我认为这不适用于我的情景。
我可以做些什么来保持用户界面的响应能力?
答案 0 :(得分:8)
批量更新 - 后台线程可以将项添加到队列中,您可以通过调用定期刷新绑定的可观察集合。如果需要处理多线程生成器
,请查看System.Collections.Concurrent命名空间答案 1 :(得分:6)
你的设计的一个主要缺点是,通过绑定到ObservableCollection,你会导致UI呈现每个被添加到列表中的项目(可能是数千个) - 即使在处理结束时只有10个项目需要渲染。
通过将ObservableCollection更改为List并在处理结束时手动刷新DataGrid,我看到了巨大的改进 - 这样UI只需要处理10个项目。我发现这种变化导致50%的性能提升,并且在处理List时允许UI 100%响应。
如果您要处理列表很长时间,并且需要显示实时更改,则可以每100个项目刷新一次DataGrid。这将显示约0.5秒精度的结果,这应该足够接近。