Necesito leer desde NetworkStream
que enviaría datos aleatoriamente y el tamaño de los paquetes de datos también varía. Estoy implementando una aplicación de subprocesos múltiples en la que cada subproceso tendría su propia secuencia desde la que leer. Si no hay datos en la transmisión, la aplicación debe seguir esperando que lleguen los datos. Sin embargo, si el servidor finaliza el envío de datos y finaliza la sesión, debe salir.Diferencia entre NetworkStream.Read() y NetworkStream.BeginRead()?
Inicialmente utilicé el método Read
para obtener los datos de la transmisión, pero solía bloquear el hilo y seguí esperando hasta que aparecieran datos en la transmisión.
La documentación en MSDN sugiere,
Si no hay datos disponibles para su lectura, el método Read devuelve 0. Si el host remoto se cierra la conexión, y todos los datos disponibles ha sido recibida , el método Read completa inmediatamente y devuelve cero bytes.
Pero en mi caso, nunca he obtenido el método Read
para devolver 0 y salir con gracia. Solo espera indefinidamente.
En mi investigación posterior, me encontré con BeginRead
que observa la transmisión e invoca un método de devolución de llamada de forma asíncrona, tan pronto como recibe los datos. He intentado buscar varias implementaciones con este enfoque, sin embargo, no pude identificar cuándo sería beneficioso usar BeginRead
en comparación con Read
.
Cuando lo miro, BeginRead
tiene la ventaja de tener la llamada asincrónica, que no bloquearía el hilo actual. Pero en mi aplicación, ya tengo un hilo separado para leer y procesar los datos de la transmisión, así que eso no tendría mucha importancia para mí.
Puede alguien por favor me ayude a comprender el mecanismo de espera y salida para
BeginRead
y cómo se diferencia deRead
?¿Cuál sería la mejor manera de implementar la funcionalidad deseada?
¿Está seguro de que el lado remoto está cerrando correctamente la conexión? Nunca tuve un problema con 'Read' que no volviera. Su enfoque de lo contrario parece ser la dirección correcta. –
@Matthew Bueno, sinceramente, no puedo decir eso con certeza. Es un servicio de terceros del que estamos leyendo. Han especificado los tiempos de parada y asumimos que sucede como se mencionó. Solo quiero verificar y volver a verificar en mi extremo antes de levantarles una bandera. –