2017-02-15 3 views
0

Je suis en train d'écrire une application consoleAcceptTcpClientAsync n'attend pas la réponse

 _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(); 
     } 

d'application est immédiatement résilié juste après la

TcpClient client = await _mainListener.AcceptTcpClientAsync(); 

Je sais qu'il n'y a pas de problème de connexion au port 5000 cause AcceptTcpClient fonctionne contrairement à la méthode Async, il va à WaitForData avec une réponse valide. J'ai besoin d'utiliser Async parce que l'application se connectera à plusieurs ips. Qu'est-ce que je rate?

Merci à l'avance ..

+0

si le AcceptTcpClient fonctionne - cela suggère une erreur de logique, car le code non asynchrone acceptera encore plus d'une connexion. – BugFinder

+0

Oui, il accepte plusieurs connexions mais attend que l'une des connexions soit fermée avant de continuer à fonctionner sur l'autre – xenep

+0

Donc, vous passez à un thread .. et revenez en boucle. Même à votre manière c'est la même chose, pour la plupart .. – BugFinder

Répondre

0

Le mot-clé await provoque l'exécution de votre méthode pour arrêter, et le reste de la méthode continuera une fois qu'un client se connecte.

Cependant, si c'est le seul code que vous appelez de votre méthode Main(), alors le programme se terminera dès que vous arriverez à cette ligne car il ne reste plus rien.

Je ne pense pas que vous ayez besoin d'utiliser async pour ce que vous essayez de faire, à condition que WaitForData() soit asynchrone en interne alors ce code tournera rondement en continuant à accepter plus de clients.

+0

J'ai besoin d'async pour se connecter à plusieurs ports de manière simulante, avec la méthode de synchronisation d'autres connexions attendent avant que l'actif soit fermé. – xenep

+1

Cela ne se produirait que si 'WaitForData' était sync lui-même. Si elle est asynchrone ou exécute la synchronisation dans un thread séparé, cette méthode continuera à tourner autour de la boucle while et acceptera le client suivant. –

+0

Je suis tombé sur le même problème, j'ai changé 'await _mainListener.AcceptTcpClientAsync();' en 'await _mainListener.AcceptTcpClientAsync(). Résultat:'. Cela a résolu le problème, mais je n'ai pas vraiment envie de bloquer le fil d'une piscine. Je suppose qu'il devrait y avoir une autre solution .... –