2017-02-15 29 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(), программа прекратится, как только вы дойдете до этой строки, поскольку ничего не осталось.

Я не думаю, что вам нужно использовать async для того, что вы пытаетесь сделать, при условии, что WaitForData() является асинхронным, тогда этот код просто обойдет цикл, продолжая принимать больше клиентов.

+0

Мне нужно async для одновременного подключения к нескольким портам, с помощью метода синхронизации другие подключения ждут до того, как активная будет закрыта. – xenep

+1

Это произойдет, только если 'WaitForData' синхронизируется. Если это асинхронно или выполняется синхронизация в отдельном потоке, этот метод будет продолжать цикл while и принимать следующего клиента. –

+0

Я столкнулся с той же проблемой, я изменил 'await _mainListener.AcceptTcpClientAsync();' на 'await _mainListener.AcceptTcpClientAsync(). Результат;'. Это решило проблему, но мне действительно не хочется блокировать поток пула. Думаю, должно быть другое решение .... –