Con la aparente falta de compatibilidad integrada para tiempos de espera IHttpAsyncHandler, presumiblemente debe gestionar su propio tiempo de espera. Quizás esto es por diseño; después de todo, está eligiendo un patrón asíncrono: ¿a quién cree MSFT que está intentando establecer un tiempo de espera predeterminado para su tarea de larga ejecución?
Lo que yo haría es usar ThreadPool.RegisterWaitForSingleObject para administrar su sondeo con un tiempo de espera adecuado. Aquí está un ejemplo de código que utilizo para evitar la espera en un servicio web que nunca regresa:
private const int REQUEST_TIMEOUT = 30000; // miliseconds (30 sec)
private void CallService()
{
try {
string url = "somewebservice.com";
WebRequest request = WebRequest.Create(url);
// Asynchronously fire off the request
IAsyncResult result = request.BeginGetResponse(new AsyncCallback(MyRoutineThatUsesTheResults), request);
// Handle timed-out requests
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(RequestTimeout), request, REQUEST_TIMEOUT, true);
}
catch (Exception ex) {
_logger.Error("Error during web service request.", ex);
}
private void RequestTimeout(object state, bool timedOut)
{
if (timedOut) {
WebRequest request = (WebRequest)state;
_logger.WarnFormat("Request to {0} timed out (> {1} sec)", request.RequestUri.ToString(), REQUEST_TIMEOUT/1000);
request.Abort();
}
}
, es necesario un IAsyncResult para trabajar con este enfoque, pero eso es un patrón establecido que no debería tener problemas para correr por las muestras sobre .
Además, se encontrará con problemas cuando IIS decida reciclar su grupo de aplicaciones/derribar el dominio de su aplicación mientras su encuesta aún se está ejecutando. Si esa es una condición que desea manejar, puede usar HostingEnvironment.RegisterObject.
En su lugar, le recomendaría averiguar por qué su código se está ejecutando más tiempo del que le gustaría, y tener controles periódicos dentro de él para detener la ejecución y devolver lo que tiene hasta ahora, si es posible. –
@ andrew-barber Estoy usando IHttpAsyncHandler para la agrupación larga (con el fin de enviar una notificación al cliente). Se supone que tiene largos tiempos de ejecución, pero aún así me gustaría tener un tiempo de espera. – Adir