我正在使用同步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操作中不必要地阻塞线程?在这种情况下,是否有惯用的方法来最大化吞吐量?
3 回答
- 3 回答
- 0 关注
- 385 浏览
添加回答
举报
0/150
提交
取消