猿问

什么是ThreadPool服务器的异步/等待方式?

我正在使用同步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操作中不必要地阻塞线程?


在这种情况下,是否有惯用的方法来最大化吞吐量?


神不在的星期二
浏览 386回答 3
3回答
随时随地看视频慕课网APP
我要回答