2010-08-03 43 views
0

我正在研究C#windows應用程序。此應用程序主要涉及套接字。適用於套接字應用程序的c#backgroundworker

我有一個名爲tcpsocket的類,它處理髮送,接收數據等所有套接字級功能。控制器類調用此tcpsocket。另外,它執行將數據記錄到文件和更新GUI的所有其他工作。我認爲在後臺工作人員中設置此控制器會很好,以確保gui始終處於響應狀態。首先,這樣做是個好主意嗎?

因爲我正在嘗試這樣做,所以我面臨着一個關於backgroundworker的progresschanged處理程序的問題。我希望能夠在文本字段中顯示連接狀態(類型:字符串),並在richTextBox中顯示應用程序發送/接收的數據(類型:字節[])。由於控制器只能通過progressChanged事件向gui發送數據,因此如何將不同類型的數據(字符串/字節[])傳遞給gui?

回答

0

如果您決定在除UI線程之外的其他線程上運行控制器,則需要將progressChanged事件從控制器掛接到UI線程上的方法處理程序。完成此操作後,您將不得不將從processChanged事件返回的數據編組到UI線程。以下是如何編組的例子。

private object _lock = new object(); //should have class scope 

private void DispalyMessage(byte[] bytes) 
{ 
    if (this.InvokeRequired) 
    { 
    lock (_lock) 
    { 
     EventHandler d = new EventHandler(DispalyMessage); 
     this.Invoke(d, new object[] { bytes }); 
     return; 
    } 
    } 
    else 
    { 
    //the bytes data has been marshaled from the controller class thread to the ui thread and can be used at will to populate a memeber of the ui. 
    } 
} 

另外,你可能需要修改你的控制器,並添加可能返回其他的東西比一個類型不同的事件:字節[]。您只需利用屬於.net框架的generic delegate類就可以做到這一點,或者您可以直接利用委託類。 Here is the Microsoft documentation on delegates.

享受!

+0

所以爲了確保我明白了,我將有事件觸發不同類型的數據,並且processHandler是一種事件。我對麼? – Batul 2010-08-03 14:53:48

+0

是的,如果你需要傳遞一個數據類型而不是字節,你可以從你的控制器類創建不同類型的事件,並將它們指向UI線程上的不同處理器。 – Doug 2010-08-03 15:29:56

+0

謝謝,這聽起來不錯。我想我會使用processChangedHandler僅顯示鏈接的狀態(已連接/斷開連接)並將事件用於所有其他數據。非常感謝......現在對我來說更加清楚。 – Batul 2010-08-03 15:46:37

相關問題