Estoy usando un NetworkStream & TcpClient para recibir datos de manera asincrónica usando BeginRead. Necesito aplicar un tiempo de espera a esta operación, de modo que después de un período de tiempo especificado la lectura se anule.BeginReceive/BeginRead timeouts
Por lo que puedo decir, esto no es compatible con NetworkStream o TcpClient: hay una propiedad ReceiveTimeout, pero esto parece aplicarse solo al equivalente síncrono: 'Leer'.
Incluso la clase Socket subyacente no parece admitir los tiempos de espera en su método BeginReceive.
He buscado en este tema y la única resolución sugerida que he visto es configurar otra cadena de fondo para cancelar la operación si no se completa dentro del período de tiempo de espera. Esto parece un hack horrible. Seguramente hay una mejor manera?
Joel nos apunta en la dirección correcta acerca de no usar un subproceso de fondo para cancelar, pero en caso que no es obvio, lo que mucha gente no es tener 1 hilo (tal vez de la encuesta de trabajadores) periódicamente limpia las conexiones muertas. Esto es necesario para liberar manejadores de socket/etc, y especialmente importante si alguna vez recibes un ataque de denegación de servicio intencional o no. – eselk
La otra opción es ['System.Threading.Timer'] (http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx), que no ocupa un hilo. – hangar