2009-07-21 7 views

Respuesta

21

¡Absolutamente! Simplemente llame al Read(...) en la transmisión. Eso bloqueará hasta que los datos estén disponibles. A menos que realmente tenga para usar el TcpClient directamente, normalmente haré todo lo que pueda en la transmisión. Si desea utilizar el socket, simplemente llame al Receive(byte[]), que se bloqueará hasta que los datos estén disponibles (o el socket esté cerrado).

Ahora, si no desea bloquear, puede usar Stream.BeginRead o Socket.BeginReceive para trabajar de forma asíncrona. (. O como ReadAsync de .NET 4.5)

personalmente encuentro Available ser bastante inútil (en ambos arroyos y cuencas) y bucle redondo con un sueño es definitivamente ineficaz - que no quieren tener que cambio de contexto el subproceso cuando los datos no han entrado, y no desea tener que esperar a que la suspensión termine cuando los datos tengan ingrese.

+0

¿Cómo usar un StreamReader.ReaderToEnd() debería funcionar también? –

+0

@Jader: solo si está pasando texto desde el otro extremo * y * cerrará el socket cuando termine de enviarse. No es bueno para las conexiones HTTP KeepAlive, por ejemplo. –

+1

@tig: Si 'ReadLine' devuelve nulo, eso significa que la transmisión se ha cerrado y no hay más líneas disponibles. Realmente parece que debes ver lo que sucede a nivel de red, p. con Wireshark. –

Cuestiones relacionadas