begin/async tcplistener 是如何工作的

How does the begin/async tcplistener work

我正在创建一个 windows 服务,该服务接受 TCP 连接,处理发送到服务器的数据,然后 returns 返回一条消息,说明该过程已完成。有几个客户端将连接到该服务,而且这个数字还在增长。为了处理这些消息,我认为使用非阻塞结构是最理想的。从最初的搜索来看,BeginAcceptTcpClient 似乎就是我要找的东西。我正在寻找 at this tutorial 来获取示例,但我对它的工作原理有一些疑问。我基于此示例的代码如下。

  1. OnClientConnected函数中,为什么还要调用WaitForClients呢?为什么听者不总是倾听?
  2. 如果在再次调用 WaitForClients 之前尝试另一个连接会怎样?我知道这是 OnClientConnected 中的第一条语句,但可能会发生两个连接 "at the same time"
  3. 我真的无法理解它在多线程方面的工作原理。如果我有 10 个模拟连接,看起来第一个将进入 OnClientConnected,然后调用 WaitForClients,这将允许处理另一个连接。这似乎是一种一次一个连接的方法,而不是有多个线程可以处理大量流量。

public class DeviceListener
{
    private TcpListener listener = null;

    public DeviceListener()
    {
        listener = new TcpListener(1001);
    }

    public void StartListener()
    {
        listener.Start();
        //TODO: Log listening started here
        WaitForClients();
    }

    private void WaitForClients()
    {
        listener.BeginAcceptTcpClient(OnClientConnected, null);
    }

    private void OnClientConnected(IAsyncResult asyncResult)
    {
        WaitForClients();
        TcpClient client = listener.EndAcceptTcpClient(asyncResult);

        if(client != null)
        {
            //TODO: Log connected
            HandleClientRequest(client);
        }
    }

    private void HandleClientRequest(TcpClient client)
    {
        //Code to process client request
    }
}
  1. 不,它接受与 BeginAcceptTcpClient 调用一样多的连接,因此为了接受另一个连接,您需要再次调用 BeginAcceptTcpClient。处理程序的开头似乎是这样做的合理位置。
  2. 它将在下一次调用 BeginAcceptTcpClient 时排队和处理,如果没有及时发生,则超时。
  3. Please refer to the docs,这些很可能是 运行 使用 ThreadPool