我有一個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的來源)。
答案是:這取決於。 – dymanoid
其技術上是一個廣泛的問題,但是...我個人可能會考慮使用不同的線程,否則你堅持單線程和其他一切將排隊,並等待操作完成 –
作爲一個方面說明:在方法1 ,第二個客戶端可以被處理,直到第一個客戶端完成。 –