【问题标题】:AcceptTcpClientAsync doesn't wait for the responseAcceptTcpClientAsync 不等待响应
【发布时间】:2017-11-14 03:48:31
【问题描述】:

我正在尝试编写一个控制台应用程序

        _mainListener = new TcpListener(new IPEndPoint(IPAddress.Any, 5000));
        _mainListener.Start();

        try
        {
            while (true)
            {

                TcpClient client = await _mainListener.AcceptTcpClientAsync();
                client.ReceiveTimeout = 60000;

                WaitForData(client);

            }
        }
        catch (Exception ex)
        {
            StartListening();
        }

应用程序在

之后立即终止
TcpClient client = await _mainListener.AcceptTcpClientAsync();

我知道连接到端口 5000 没有问题,因为 AcceptTcpClient 的工作方式与 Async 方法不同,它会以有效的响应进入 WaitForData。我需要使用异步之一,因为应用程序将连接到多个 ip。我错过了什么?

提前谢谢..

【问题讨论】:

  • 如果 AcceptTcpClient 工作 - 它会提示逻辑错误,因为非异步代码仍然会接受多个连接。
  • 是的,它接受多个连接,但要等待一个连接关闭,然后才能继续在另一个连接上工作
  • 所以你交给一个线程......然后回到循环。在大多数情况下,即使你的方式也是一样的......

标签: c# sockets asynchronous tcpclient tcplistener


【解决方案1】:

await 关键字导致您的方法停止执行,一旦客户端连接,该方法的其余部分将继续。

但是,如果这是您从 Main() 方法调用的唯一代码,那么程序将在您到达该行后立即终止,因为没有任何东西在运行。

我认为您不需要使用异步来执行您正在尝试执行的操作,前提是 WaitForData() 在内部是异步的,那么此代码将继续循环以继续接受更多客户端。

【讨论】:

  • 我需要异步连接到多个端口,使用同步方法,其他连接在关闭活动端口之前正在等待。
  • 只有在WaitForData 自身同步时才会发生这种情况。如果是异步的或在单独的线程中运行同步,该方法将继续循环并接受下一个客户端。
  • 我遇到了同样的问题,我已将await _mainListener.AcceptTcpClientAsync(); 更改为await _mainListener.AcceptTcpClientAsync().Result;。这解决了问题,但我真的不想阻塞池的线程。我想应该有另一种解决方案....
猜你喜欢
  • 2021-08-14
  • 2013-10-13
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多