我正在用C#编写服务器。 msdn.microsoft.com上的异步示例建议以下内容。

  • BeginAccept监听客户端(并在客户端调用时启动新线程)。
  • BeginReceive接收来自客户端的数据(并启动一个新线程以执行此操作)。
  • BeginSend答复以将数据发送到客户端(并在其上启动另一个线程)。

  • 在这一点上,似乎有4个独立的线程,从我的观点(可能是幼稚的)来看,实际上只需要2个。服务器可以继续监听; 1个需要与客户端进行对话。为什么我与客户端的对话需要3个线程,因为我必须等待答复才能发送,而在等待接收来自客户端的数据时我将不做任何其他事情?

    干杯

    最佳答案

    BeginAccept不启动新线程。它将处理程序附加到OS级别 Hook 。没有线程可以完成此操作的工作。 BeginReceiveBeginSend也是如此。这些都没有启动新线程。

    当他们添加处理程序的事件实际触发时,就会创建一个线程池线程来响应发生的操作。此处完成的CPU限制工作通常应该很少。您将在这里看到很多请求的线程池线程,但是它们所完成的工作很少,因此它们很快就会发送回池中。

    线程池是为此类型的使用而设计的。与其为每个事件响应创建完整的线程(这将是昂贵的),不如创建仅1-2个线程并连续重复使用它们来依次响应所有这些事件。池将仅创建所需数量的线程,以跟上足够小的积压。

    09-06 09:36