我正在使用同步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操作中不必要地阻塞线程?
在这种情况下,是否有惯用的方法来最大化吞吐量?
相关分类