【问题标题】:How does the begin/async tcplistener workbegin/async tcplistener 是如何工作的
【发布时间】:2018-03-21 03:46:55
【问题描述】:

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

  1. OnClientConnected函数中,为什么要再次调用WaitForClients?为什么听者不总是听?
  2. 如果在再次调用WaitForClients 之前尝试另一个连接会发生什么情况?我知道这是OnClientConnected 中的第一条语句,但可能有两个连接“同时”发生
  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
    }
}

【问题讨论】:

    标签: c# multithreading asynchronous service tcplistener


    【解决方案1】:
    1. 不,它接受的连接数与BeginAcceptTcpClient 调用的连接数完全相同,因此要接受另一个连接,您需要再次调用BeginAcceptTcpClient。处理程序的开始似乎是一个合理的地方。
    2. 它将排队并在下次调用 BeginAcceptTcpClient 时进行处理,如果没有及时发生,则会超时。
    3. Please refer to the docs,这些最有可能使用 ThreadPool 运行。

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 2012-05-13
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多