2009-07-21 3 views

ответ

21

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

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

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

+0

Использование StreamReader.ReadToEnd() должно работать тоже? –

+0

@Jader: Только если он передает текст с другого конца *, и * он закроет сокет, когда он будет завершен. Например, не подходит для соединений HTTP KeepAlive. –

+1

@tig: Если 'ReadLine' возвращает значение null, это означает, что поток был закрыт и больше нет доступных строк. Похоже, вы должны посмотреть, что происходит на сетевом уровне, например. с Wireshark. –

Смежные вопросы