2010-08-25 48 views
1

我們的小組閱讀廣泛引用的文章http://blog.quantumbitdesigns.com/2008/07/22/wpf-cross-thread-collection-binding-part-4-the-grand-solution/,並想知道如果你們能與我們的問題幫助:WPF:運行任務,而不帶有動畫的性能干擾

團隊成員都擁有一個具有動畫的運行WPF應用程序。問題是即使在不同的線程上執行後臺任務也會導致動畫抖動。問題是創建一個低優先級的常規線程並沒有幫助,因爲這些任務最終必須在UI控件中顯示數據。 例如: 我們有一個控件,顯示應用程序正在做什麼的日誌。 有一個單獨的DLL,它有一個方法GetLogs,它返回最新日誌的列表。 我們使用定時器激活它,每隔500ms應用程序就會得到一個新的列表,最多可包含10000個條目。 日誌用戶控件只是一個綁定到ObservableCollection的ListView。 我們的要求是將我們收到的列表中的每個條目添加到Observable集合中。我們還檢查收集是否超出了我們提供的限制(例如100000個條目)。如果它超過限制,我們刪除前10000條目。

現在,這隻能在UI調度程序對象中完成,所以最好的解決方案是使用BackGroundWorker。但是這個線程沒有低優先級,並且不能在那裏設置優先級。我們想知道這是否會有幫助,因爲我們的理解是線程使用Dispatcher.Invoke方法發送UI元素。

因此,這是真正平行的我用Dispatcher.BeginInvoke(ThreadPriority.Low ......)將每個字符串添加到可觀察集合 這會減慢日誌顯示加上動畫仍然胡思亂想。

對於這樣的常見問題(UI性能和後臺任務),是否有開箱即用的解決方案?

+0

僅在從後臺線程獲取數據並將其顯示在UI上時,是否會出現抖動行爲? – Nate 2010-08-25 15:58:06

+0

動畫的本質是什麼? – Jay 2010-08-25 15:58:27

+0

@Jay:進度指示器 – 2010-08-26 13:30:27

回答

0

我不確定你在後臺線程中做了什麼,但是每次調用Dispatcher.BeginInvoke時,都會在主線程上做一些事情。在你的情況中,每1/2秒,你在主UI線程中做10000件事情。由於您更新ObservableCollection,您每次添加/刪除內容時都會發起一個事件。

在這種情況下,而不是使用可觀察的集合,我只是使用一個列表。在後臺線程中創建列表,然後將您的列表視圖綁定到具有一個Dispatcher.BeginInvoke調用的列表視圖。