Лучший способ ждать, пока данные TcpClient станут доступными? - PullRequest
11 голосов
/ 21 июля 2009
while (TcpClient.Client.Available == 0)
{
    Thread.Sleep(5);
}

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

1 Ответ

26 голосов
/ 21 июля 2009

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

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

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

...