Pregunta

En C #, al recibir datos de red con los métodos BeginReceive / EndReceive, ¿hay alguna razón por la que no deba procesar los paquetes tan pronto como los reciba? Algunas de las tareas pueden ser decentemente intensivas en CPU. Pregunto porque he visto algunas implementaciones que empujan los paquetes a una cola de procesamiento y luego los manejan allí. Para mí, esto parece redundante porque, hasta donde yo sé, los métodos asíncronos también operan en un grupo de subprocesos.

¿Fue útil?

Solución

Como lo señala Mitch, debe poder recibir suficientes paquetes para tener un mensaje / marco completo. Pero no hay ninguna razón por la que no debas comenzar a procesar ese marco inmediatamente y emitir otro BeginReceive. De hecho, si cree que su procesamiento podría llevar algún tiempo, es mejor que lo entregue al grupo de subprocesos de trabajo en lugar de bloquear un subproceso del grupo de E / S (que es donde se activará su devolución de llamada).

Además, a menos que espere un número bajo de conexiones, generar un hilo para manejar cada conexión no es un enfoque muy escalable, aunque tiene el beneficio de cierta simplicidad.

Hace poco escribí un artículo sobre la canalización del procesamiento de datos desde un socket de red, que puede encontrar aquí .

Otros consejos

Generalmente, necesita recibir paquetes 'suficientes' para tener un elemento de datos que sea 'procesable'.

OMI, es mejor tener un hilo cuyo trabajo esté recibiendo datos y otro para procesarlo realmente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top