Подтвердить что ты не робот

Лучший способ дождаться получения данных TcpClient?

while (TcpClient.Client.Available == 0)
{
    Thread.Sleep(5);
}

Есть ли лучший способ сделать это?

4b9b3361

Ответ 1

Абсолютно! Просто вызовите Read(...) в потоке. Это будет заблокировано до тех пор, пока данные не будут доступны. Если вам действительно не нужно напрямую использовать TcpClient, я обычно делаю как можно больше в потоке. Если вы хотите использовать сокет, просто вызовите Receive(byte[]), который будет блокироваться до тех пор, пока данные не будут доступны (или сокет не будет закрыт).

Теперь, если вы не хотите блокировать, вы можете использовать Stream.BeginRead или Socket.BeginReceive для работы асинхронно. (Или ReadAsync от .NET 4.5.)

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