while (TcpClient.Client.Available == 0)
{
Thread.Sleep(5);
}
¿Hay una manera mejor de hacer esto?¿La mejor manera de esperar a que estén disponibles los datos de TcpClient?
while (TcpClient.Client.Available == 0)
{
Thread.Sleep(5);
}
¿Hay una manera mejor de hacer esto?¿La mejor manera de esperar a que estén disponibles los datos de TcpClient?
¡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.
¿Cómo usar un StreamReader.ReaderToEnd() debería funcionar también? –
@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. –
@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. –