Pregunta

No he podido encontrar una manera de cancelar / finalizar la operación de lectura asíncrona después de una HttpWebRequest exitosa. No hay forma de establecer el tiempo de espera, ThreadPool.RegisterWaitForSingleObject no funciona también. Y cerrar el socket subyacente no es una opción también porque ni HttpWebRequest / Reponse proporcionan acceso a él.

Editar:

Lamentablemente, este enfoque que Sunny sugiere solo funciona para HttpWebRequest.BeginGetResponse. Para el flujo que obtiene después de GetResponseStream () por alguna razón, RegisterWaitForSingleObject no funciona: nunca se llama a la devolución de llamada.

La situación es la siguiente: Tengo una aplicación que usa HttpGetRequest. Se crea utilizando el ejemplo predeterminado de MSDN para httpwebrequest asíncrono. Obtener respuesta está funcionando como un encanto. Pero en raras ocasiones el servidor al que se conecta mi httpwebrequest se olvida de cerrar el socket. Así que estoy colgado de una lectura infinita de BeginRead.

En algunas raras ocasiones el otro servidor olvida

¿Fue útil?

Solución

¿Por qué no RegisterWaitForSingleObject? Puede usarlo para el tiempo de espera, y en el controlador puede llamar a request.Abort ().

Aquí hay un ejemplo . Por cierto, he usado un enfoque simial antes de encontrar este artículo en el pasado, y funcionó de maravilla.

NOTA: El final real de la operación ocurrirá en el siguiente Stream.Read (solo de la solicitud / respuesta fue asíncrona) o Stream.EndRead (si la lectura también es asíncrona). Aún necesita capturar la excepción lanzada en el controlador EndXXXX.

EDITAR: si nunca se llama a RegisterWaitForSingleObject, entonces tiene otro problema, que probablemente sea un ThreadPool que no tiene suficientes hilos libres. La devolución de llamada para el objeto RegisterWaitForSingle se llama en un subproceso ThreadPool, y si no hay un subproceso libre en el grupo, nunca se llamará. Tienes algunas soluciones:

  1. Haga que sus páginas sean asíncronas. ¿Por qué ? Cómo .
  2. Cambie los subprocesos máximos en el grupo .

En cualquier caso, aumentar el tamaño de la agrupación no te ayudará demasiado. Debe inspeccionar su código para detectar fugas de recursos (flujo) y asegurarse de no solo llamar a request.Abort (), sino también cerrar la respuesta. Asegúrese de que en sus devoluciones de llamada utilice el método EndXXX adecuado, etc.

I nazdrave :)

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