begin / async tcplistener如何工作

时间:2017-10-09 20:55:15

标签: c# multithreading asynchronous service tcplistener

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

  1. OnClientConnected函数中,为什么还需要再次调用WaitForClients?为什么听众总是不听?
  2. 如果再次调用WaitForClients之前尝试了另一个连接,会发生什么?我知道这是OnClientConnected中的第一个声明,但可能会发生两个连接"同时#34;
  3. 我无法理解这在多线程方面是如何工作的。如果我有10个模拟连接,看起来第一个将进入OnClientConnected,然后调用WaitForClients,这将允许处理另一个连接。这似乎是一次一个连接,而不是有几个线程可以处理大量的流量。
  4. 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 个答案:

答案 0 :(得分:2)

  1. 不,它接受与BeginAcceptTcpClient次呼叫完全相同的连接数,因此要接受另一个连接,您需要再次呼叫BeginAcceptTcpClient。处理程序的开头似乎是一个合理的地方。
  2. 如果没有及时发生,它将排队并在下次拨打BeginAcceptTcpClient时处理或超时。
  3. Please refer to the docs,这些很可能是使用ThreadPool运行的。