2015-10-26 31 views
-3

我使用Meebey SmartIrc4Net編碼IRC客戶端。將控件添加到BackgroundWorker中的StackPanel或從另一個BackgroundWorker調用的異步任務

通過使用BackgroundWorker,我通過類提供的.Listen()方法來監聽所有IRC事件。

我有一個OnJoin事件處理方法,此方法通過產生另一個BackgroundWorker並輪詢其中的數據來獲取通道的用戶列表。

所以現在我有一個主線程,一個irc事件bgWorker,據我所知是主線程的一個子節點,還有一個用戶列表bgWorker。

問題是我無法在任何bgWorkers中創建UI元素,例如,如果我想將按鈕添加到StackPanel我不能在bgWorkers工作方法中聲明按鈕,或者即使我使用reportProgress方法作爲它似乎是向第一個bgWorker報告而不是主線程。

調用線程必須是STA,因爲很多UI組件都需要這個。

自從我的應用程序使用.Net Framework 4.5之後,我已經使用了bgWorkers和異步/等待和任務,兩者都無濟於事。

這是不同的最常見的情況下,你從一個bgWorker添加到主線程的控制,我有三個線程,我試圖從主線程的孩子的孩子添加控制,和建議的解決方案僅在有單個bgWorker和主線程時纔有用。

在此先感謝。

+0

可能的重複? http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c –

+0

請downvoters,關心解釋你爲什麼downvote? – FuuRe

+0

我低估了,因爲你沒有顯示任何證據表明你研究過這個(如果你將鼠標懸停在downvote按鈕上,這是它爲你提供downvote的原因的第一個原因)。當我搜索時,我立即發現了我在第一條評論中提供的鏈接。即使你做了搜索並找不到任何東西,你仍然需要在你的問題中提供證據給你的研究。 –

回答

0

您不能從除UI線程以外的任何線程創建控件。

要在UI線程上運行代碼,您可以使用Dispatcher.BeginInvoke,可以在啓動後臺進程之前在UI線程(在Dispatcher屬性中)或在UI線程中使用statis Dispatcher.CurrentDispatcher屬性找到調度程序。