2011-03-02 140 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秒精度的結果,應該足夠接近。