2011-03-02 108 views
2

我希望能够快速将项目添加到数据网格,而不会导致UI延迟。我正在做什么: 我正在使用绑定到数据网格的ObservableCollection。导致UI延迟的Datagrid绑定(WPF)

我使用后台线程循环并调用当前调度器上的调用,仅当从可观察集合中插入/移除时。调用BeginInvoke反而会产生不良结果。

我知道在调度程序上调用那么多是造成延迟,但我不知道还有什么要做。我以前曾使用过后台工作人员,但我认为这不适用于我的场景。

我能做些什么来保持UI的响应?

+0

您的集合包含多少个项目,以及您添加了多少项目?是否有任何其他代码来自插入(例如CollectionChanged处理,或绑定项目时运行的代码)? – 2011-03-03 01:10:27

+0

收集从0项开始,并一次添加一个。如果有超过10个将被删除。当我每秒添加大约100个项目时,UI会滞后。如果集合中有10个以上的项目,除了删除之外,没有额外的代码。 – user404068 2011-03-03 01:24:12

回答

8

批量更新 - 后台线程可以将项目添加到队列中,并且可以通过调用定期刷新绑定的可观察集合。如果您需要处理多线程生产者,请查看System.Collections.Concurrent命名空间

+0

+1:你教了我一些东西:) – 2011-03-03 03:18:41

+0

System.Collections.Concurrent仅适用于.NET 4 FWIW – 2011-03-03 05:10:54

6

设计中的一个主要弱点是,通过绑定到ObservableCollection,导致UI呈现每个被添加到列表中的项目(可能有数千个) - 即使在处理结束时,只有10个项目需要渲染。

通过将ObservableCollection更改为List以及在处理结束时手动刷新DataGrid,我看到了巨大的改进 - 这种方式仅需要UI处理10个项目。我发现这个变化引起了50%的性能提升,并且在列表正在被处理时允许UI 100%响应。

如果您正在处理列表很长一段时间,并且需要显示实时更改,则可以每100个项目刷新一次DataGrid。这将显示约0.5秒精度的结果,应该足够接近。