2010-01-28 96 views
1

說我有兩個用戶控件,UC1和UC2。用戶在UC1中選擇一些內容,這需要一些時間,因此該過程被關閉。 UC2需要在UC1完成時更新其視圖並在另一個線程上完成自己的一些工作。但UC2依賴於UC1後臺線程的輸出,所以它必須等到該線程完成後纔開始。WPF線程問題

UC1需要更新ObservableCollection,以便在後臺線程完成時更新其視圖,就像UC1一樣異步完成。

最好的辦法是做什麼?我試過把它們線程化,然後從UC1的線程發出一條消息,但是然後UC2無法修改它的ObservableCollection,因爲它不在正確的線程上 - 它認爲它在UC1的線程上。

我是否需要將消息事件從UC1發送到UC2,這是否安全?

人們通常如何處理這個問題?

回答

2

兩個UserControls應該位於同一個線程上。這就是WPF的設計。由於UC2取決於UC1也依賴於的事件,所以我會讓UC1規定事件的生命週期,並在工作完成時將消息發送給UC2,或者讓UC2訂閱ObservableCollectionCollectionChanged事件。它們都生活在同一個UI線程中,所以它們之間的編組不需要,只需要將後臺線程編組到相應的UserControl即可。

+0

不,儘管UC1和UC2都在同一個UI線程上,但如果在UC1中,您啓動了一個新的後臺進程線程來執行工作 - 它是UC1和UC2都不在線的新線程。如果您從UC2啓動的該線程中發出消息,則消息事件仍在該後臺線程中,因此您無法對您的可觀察集合進行任何操作。這就是我認爲你必須將後臺線程放回UI線程,然後讓UC2完成其工作的地方。 – Nicros 2010-01-28 21:36:25

+0

哎呀抱歉,錯過了最後一句 - 我想問題是如何將來自我的BackgroundWorker線程的消息編組到接收消息的用戶控件的UI線程上? – Nicros 2010-01-28 21:59:22

+0

任務完成! 使用BackgroundWorker是關鍵,因爲任何RunWorkerCompleted事件處理程序都會自動返回到UI線程(在我的情況中)。涼。 – Nicros 2010-01-28 22:31:50