我正在使用同步API和线程池开发一个类似于此的TCP服务器:
TcpListener listener;
void Serve(){
while(true){
var client = listener.AcceptTcpClient();
ThreadPool.QueueUserWorkItem(this.HandleConnection, client);
//Or alternatively new Thread(HandleConnection).Start(client)
}
}
假设我的目标是以最低的资源使用率处理尽可能多的并发连接,这似乎很快就会受到可用线程数量的限制。我怀疑通过使用非阻塞的任务API,我将能够用更少的资源处理更多的问题。
我的办法:
async Task Serve(){
while(true){
var client = await listener.AcceptTcpClientAsync();
HandleConnectionAsync(client); //fire and forget?
}
}
但我觉得这可能会造成瓶颈。也许HandleConnectionAsync将花费非常长的时间来完成第一个等待,并将停止主接受循环的进行。这将只使用一个线程,还是运行时会在它认为合适的多个线程运行?
是否有一种方法可以将这两种方法结合起来,以便我的服务器能够准确地使用它所需的线程数量来满足正在运行的任务的数量,但是这样它就不会不必要地阻止IO操作中的线程了?
相似问题