我有一个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
s,关闭了整个服务器线程(可能是因为客户端出现了一些超时,无法找到源代码)代码在Embedded Compact 2013机器上的.NET Compact框架上运行时的异常。
答案 0 :(得分:0)
我基本上想问一下,在同一个线程中处理客户端通信或启动一个新的更好是否更好;所以,如果有最好的做法。
当您使用带套接字的线程时,每次处理套接字的线程暂停时都可以阻塞I / O通道。而且,你的第一种情况比第三种情况好,因为你的程序不需要改变线程。
因此,根据我的经验,处理多个套接字的最佳方法是使用单个线程及其异步方法。它通过套接字比多个线程更快更安全。使用此技术,您可以优化机器资源并避免线程竞争它们。
检查我的answer以了解如何在套接字中使用异步方法。在这种情况下,我按小时参加15k套接字请求,并且处理器的使用不超过1%。