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

  • OnClientConnected函数中,为什么要再次调用WaitForClients?为什么听众不总是听?
  • 如果在再次调用 WaitForClients 之前尝试另一个连接会发生什么?我知道这是 OnClientConnected 中的第一个语句,但可能有两个连接“同时”发生
  • 我真的不明白这在多线程方面是如何工作的。如果我有 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
        }
    }
    

    最佳答案

  • 不,它接受与 BeginAcceptTcpClient 调用一样多的连接,因此为了接受另一个连接,您需要再次调用 BeginAcceptTcpClient。处理程序的开始似乎是一个合理的地方。
  • 它将在下一次调用 BeginAcceptTcpClient 时排队和处理,或者如果没有及时发生则超时。
  • Please refer to the docs ,这些很可能使用 ThreadPool 运行。
  • 关于c# - begin/async tcplistener 如何工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46654825/

    10-11 20:08