while (TcpClient.Client.Available == 0)
{
Thread.Sleep(5);
}
Есть лучший способ сделать это?
while (TcpClient.Client.Available == 0)
{
Thread.Sleep(5);
}
Есть лучший способ сделать это?
Абсолютно! Просто вызовите Read(...) в потоке. Это будет блокироваться до тех пор, пока данные не будут доступны. Если вам действительно необходимо использовать TcpClient напрямую, я обычно делаю все возможное в потоке. Если вы хотите использовать сокет, просто вызовите Receive(byte[]), который будет блокироваться до тех пор, пока данные не будут доступны (или сокет не будет закрыт).
Теперь, если вы не хотите блокировать, вы можете использовать Stream.BeginRead или Socket.BeginReceive для асинхронной работы. (Или ReadAsync в .NET 4.5.)
Я лично нахожу Available практически бесполезным (как для потоков, так и для сокетов), а зацикливание со сном определенно неэффективно - вы не хотите, чтобы контекст переключал поток, когда данные не поступили, и вы не не нужно ждать окончания сна, когда данные пришли.
ReadLine возвращает значение null, это означает, что поток был закрыт и доступных строк больше нет. Это действительно звучит так, как будто вы должны посмотреть, что происходит на сетевом уровне, например. с Wireshark.
- person Jon Skeet; 04.09.2013
Socket.Poll() или Socket.Select(), и, поскольку у TcpClient нет функций, в идеале его не следует использовать. Блокирование чтения не является хорошей идеей, поскольку оно не позволяет указать промежуток времени для ожидания данных.
- person Hi-Angel; 27.07.2015
TcpClient.ReceiveTimeout, если хотите... разве это не сделает то, о чем вы говорите?
- person Jon Skeet; 27.07.2015
Available. Так что, возможно, это не совсем бесполезно в моем случае. @ДжонСкит
- person corylulu; 09.03.2018