新线程中的C#TCP客户端?

问题描述 投票:0回答:1

我有一个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随机抛出ThreadAbortExceptions,关闭整个服务器线程(可能是由于客户端的一些超时,无法找到Exception的源代码,因为代码在.NET Compact上运行嵌入式Compact 2013机器上的框架)。

c# multithreading tcplistener
1个回答
0
投票

我基本上想问一下,在同一个线程中处理客户端通信或者开始一个新的更好是否更好;所以,如果有最好的做法。

当您使用带套接字的线程时,每次处理套接字的线程暂停时,您都可以阻止I / O通道。而且,你的第一种情况比第三种情况好,因为你的程序不需要改变线程。

因此,根据我的经验,处理多个套接字的最佳方法是使用单个线程及其异步方法。它通过套接字比多个线程更快更安全。使用此技术,您可以优化机器资源并避免线程竞争它们。

检查我的answer,了解如何在套接字中使用异步方法。在这种情况下,我按小时参加15k套接字请求,并且处理器的使用不超过1%。

© www.soinside.com 2019 - 2024. All rights reserved.