2017-02-15 115 views
0

我试图写一个控制台应用程序AcceptTcpClientAsync不等待响应

 _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。我需要使用Async,因为应用程序会连接到多个ips。我错过了什么?

在此先感谢..

+0

如果AcceptTcpClient工作 - 它会提示逻辑错误,因为非异步代码仍然会接受多个连接。 – BugFinder

+0

是的,它接受多个连接,但等待一个连接关闭,然后继续在另一个连接上工作。 – xenep

+0

因此,您切换到一个线程,然后回到循环中。即使你的方式是相同的,大部分.. – BugFinder

回答

0

await关键字会使您的方法停止执行,并且该方法的其余部分将继续一次一个客户端连接。

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

我不认为你需要为你想要做的事情使用异步,只要WaitForData()在内部是异步的,那么这段代码就会绕着循环继续接受更多的客户端。

+0

我需要异步连接到多个端口simulatenously,同步方法之前,其他连接正在等待活动之一被关闭。 – xenep

+1

只有当WaitForData自身同步时才会发生。如果它是异步的或者在单独的线程中运行同步,则此方法将循环执行while循环并接受下一个客户端。 –

+0

我遇到了同样的问题,我改变了'await _mainListener.AcceptTcpClientAsync();'到'await _mainListener.AcceptTcpClientAsync()。Result;'。这解决了问题,但我真的不想阻塞池的线程。我想应该有另一种解决方案.... –