2010-02-23 20 views
0

我想創建一個WinForm應用程序,它必須從套接字中獲取數據。帶有另一個線程中的套接字的GUI

我想將代碼從套接字讀取到單獨的線程中,並且我知道InvokeRequired/BeginInvoked模式。

考慮到WinForm場景,哪種類型的C#線程最適合我的目的?它是否足夠用於從套接字或BackgroundWorker等其他類型讀取數據的完全專用的System.Threading.Thread?或者我應該考慮其他的東西?

+0

不需要簽名(或問候語)。 – Ricket 2010-02-23 13:55:18

回答

0

此線程運行了很長時間?如果您需要它運行很長時間,並且如果您不需要直接與GUI進行交互(也許將數據緩存到緩衝區),那麼我會使用System.Threading.Thread。我一直在使用BackgroundWorker,發現它雖然允許你通過事件更新GUI,但它使用.NET線程池。線程池有可用的線程數量有限,因此如果您需要通過BeginInvoke使用Windows Workflow或大量委託,則可能會通過綁定太多的線程池線程來傷害應用程序性能。

+0

捆綁一個Pool-thread不會比創建一個新的更慢(或更好)。 – 2010-02-23 14:04:40

+0

是的!它會在接收到大量數據的情況下運行數小時,還需要更新GUI。我肯定會使用緩存緩存+刷新Gui每n毫秒,因爲ThreadPool將被快速填滿。謝謝! – 2010-02-23 14:22:03

+0

@亨克:我一直覺得,如果你使用線程池中的線程,那麼你將無法啓動另一個線程池線程,直到它變爲可用。如果你不能這樣做,那麼你不能做任何工作。按照這個定義,你會傷害應用程序性能,不是嗎? – Dave 2010-02-23 15:01:46

2
Thread workerThread = new Thread(); 
// do threadstart parameters or whatever 
workerThread.IsBackground = true; 
workerThread.Start(); 

這應該足夠了......如果這是一個問題,您甚至可以將其設置爲優先。

我並不特別在意BackgroundWorker。儘管事件很有幫助,但我不需要幫助。我覺得它是有限制的,因爲我使用了很多異步方法(Action/Func)。

作爲MSDN狀態與背景工人的過程:

要爲一個後臺操作,添加一個事件處理程序事件的DoWork。在此事件處理程序中調用您的耗時 操作。要啓動該操作,請調用RunWorkerAsync。要接收 進度更新通知,請處理ProgressChanged事件。要在完成操作 時收到通知,請處理RunWorkerCompleted事件。

使用System.Threading.Thread似乎很簡單。

+0

嗨dboarman!感謝您的回覆,我同意你的意見!我問過這個問題,因爲我今天才意識到這個幫手類,但我不明白這樣做的特殊原因。這個類在GUI場景中總是被稱爲助手類。 – 2010-02-23 14:17:41

1

您可以使用APM模式,即

mySocket.BeginReceive(..., myCallBack); 

但它不是我喜歡的圖案。我會使用ThreadPool,可能通過BackgroundWorker。

+0

謝謝Henk!我意識到,由於收到大量數據,我可能會遇到問題。 – 2010-02-23 14:23:35

+0

@Abruzzo,對於線程部分(有多少線程),數據量無關緊要。但是套接字(連接)的數量確實如此。 – 2010-02-23 18:50:25

相關問題