2017-09-13 100 views
0

我有一個TcpListener偵聽傳入連接,現在我基本上想問問是否更好地在同一線程中處理客戶端通信或啓動一個新的;所以如果有最佳做法。新線程中的C#TCP客戶端?

我故意沒有添加try-catch塊和其他處理以保持問題簡單明瞭。

方法1:

while(true) 
{ 
    TcpClient client = listener.AcceptTcpClient(); 
    processData(client); 
} 

方法2:

while(true) 
{ 
    TcpClient client = listener.AcceptTcpClient(); 
    new Thread(() => processData(client)).Start(); 
} 

方法3:

while(true) 
{ 
    TcpClient client = listener.AcceptTcpClient(); 
    Thread t = new Thread(() => processData(client)); 
    t.Start(); 
    t.Join(); 
} 

的代碼是這樣寫之前方法1,但processData隨機投擲ThreadAbortException S,這會關閉整個服務器線程(可能是因爲某些超時無線因爲代碼在Embedded Compact 2013機器上的.NET Compact Framework上運行,所以無法準確找到Exception的來源)。

+2

答案是:這取決於。 – dymanoid

+1

其技術上是一個廣泛的問題,但是...我個人可能會考慮使用不同的線程,否則你堅持單線程和其他一切將排隊,並等待操作完成 –

+0

作爲一個方面說明:在方法1 ,第二個客戶端可以被處理,直到第一個客戶端完成。 –

回答

0

我基本上想問一下,在同一個線程中處理客戶端通信還是開始一個新的更好;所以如果有最佳做法。

當您使用套接字線程時,每次處理套接字的線程都暫停時,可以阻塞I/O通道。而且,你的第一種情況比第三種情況好,因爲你的程序不需要改變線程。

所以,根據我的經驗,處理多個套接字的最好方法是使用單個線程及其異步方法。它比套接字多線程更快更安全。有了這個技術,您可以優化機器資源並避免線程爲他們競爭。

請查看我的answer以瞭解如何在套接字中使用異步方法。在這種情況下,我按小時處理了15k套接字請求,處理器的使用率不超過1%。