2011-03-02 69 views
1

我開發了一個用於通過網絡發送和接收消息的類(以C#)。它創建一個新的線程(偵聽器線程),等待一個新的消息到來,然後引發一個事件。 問題是在偵聽器線程中引發事件,並且當我想在wpf應用程序中使用此類時,嘗試處理事件時發生運行時錯誤 錯誤是:調用線程無法訪問此對象,因爲不同的線程擁有它。處理後臺線程引發的事件

當事件在所提到的類中引發時,是否有適當的方法來處理這種情況?

回答

2

您必須在UI線程上更新UI對象。您可以使用窗口的調度,以執行代碼有:

this.Dispatcher.Invoke(new Action(() => 
{ 
    // Code that updates UI here 
})); 
+0

謝謝,我知道這一個,反正是有,我可以從類本身主線程提高的情況下,我的意思是我希望類的用戶(wpf)能夠像其他事件一樣處理事件 – Mehrshad 2011-03-03 00:10:30

+0

關於事件有三件事:它引發的線程,發件人對象和事件參數。您可以提供所需的任何發件人和事件參數,如果您希望在UI線程中引發該事件,則可以在調度程序方法內觸發該事件。 – RandomEngy 2011-03-26 15:58:00

2

BackgroundWorker顯式支持對UI線程的封送處理。你必須使用它,然後調用它的ReportProgress()方法。雖然針對報告進度進行了優化,但您不需要就可以使用。有一個接受對象的重載,你可以傳遞任何你想要的東西。事件處理程序將其作爲e.UserState值來獲取。從那裏,你可以直接使用該對象或使用它來重新引發另一組事件。

請注意該對象的線程安全性要求。該工作人員繼續運行,並且以任何方式與執行ProgressChanged事件處理程序同步,而不是而不是。所以它不應該再更新對象。最好在調用ReportProgress()後創建它的新實例。