簡體   English   中英

新線程中的C#TCP客戶端?

[英]C# TCP Client in new thread?

我有一個TcpListener偵聽傳入的連接,現在我基本上想問一下在同一線程中處理客戶端通信還是啟動一個新的客戶端是更好的方法。 因此,如果有最佳做法。

我故意不添加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 ,它關閉了整個服務器線程(可能是由於客戶端超時的原因,因為代碼在.NET上運行而無法確切找到Exception的來源)嵌入式Compact 2013機器上的Compact框架)。

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

當您將線程與套接字一起使用時,每次處理套接字的線程暫停時,都可以阻塞I / O通道。 而且,您的第一種情況要優於第三種情況,因為您無需更改線程。

因此,以我的經驗,處理多個套接字的最佳方法是使用單個線程及其異步方法。 它比套接字的多個線程更快,更安全。 通過這種技術,您可以優化機器資源,並避免線程爭奪它們。

檢查我的答案 ,看看如何在套接字中使用異步方法。 在這種情況下,我按小時參加了15,000個套接字請求,並且處理器的使用率不超過1%。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM