Ответ 1
Абсолютно! Просто вызовите Read(...)
в потоке. Это будет заблокировано до тех пор, пока данные не будут доступны. Если вам действительно не нужно напрямую использовать TcpClient
, я обычно делаю как можно больше в потоке. Если вы хотите использовать сокет, просто вызовите Receive(byte[])
, который будет блокироваться до тех пор, пока данные не будут доступны (или сокет не будет закрыт).
Теперь, если вы не хотите блокировать, вы можете использовать Stream.BeginRead
или Socket.BeginReceive
для работы асинхронно. (Или ReadAsync
от .NET 4.5.)
Я лично считаю, что Available
будет в значительной степени бесполезным (как для потоков, так и для сокетов), и цикл со сном определенно неэффективен - вы не хотите, чтобы контекст переключил поток, когда данные не вошли, и вы не хотите, чтобы ждать завершения сна, когда данные вошли.