Estoy creando una biblioteca de registro que almacena todo en una tabla de Azure. Escrito a esa mesa, obviamente, necesita una gran cantidad de tiempo (no más de 1 segundo, pero aún así es demasiado para hacer que la espera por el usuario), por lo que el método de registro devuelve una instancia de LogResult, aquí está la claseImpedir que IIS elimine una tarea antes de que finalice
public class LogResult
{
public string Id { get; set; }
public Task LoggingTask { get; set; }
public LogResult(string id, Task task)
{
Id = id;
LoggingTask = task;
}
}
Y aquí es cómo el método de registro termina
return new LogResult(id, Task.Factory.StartNew(() =>
DoLogInAzure(account, id, exception, request))
);
para dar a la persona que llama la opción de esperar a que se complete (si se trata de una aplicación de consola, por ejemplo). El problema al que me enfrento es que IIS no debería esperar esperar antes de devolver al usuario la respuesta ... y si no lo espero, IIS no siempre ejecutar la tarea. La idea es mostrarle al usuario un mensaje "... Si nos contacta, asegúrese de mencionar su número de problema, XXX" y no lo haga esperar hasta que se haya escrito la entrada del registro.
¿Hay alguna manera de forzar a IIS a esperar hasta que la tarea finalice, incluso después de que devolvió la respuesta? Estoy pensando que podría necesitar codificar un servicio de Windows que acepte la solicitud de forma asíncrona, pero parece mucho trabajo simplemente agregar una entrada de registro ... especialmente si puedo obligar a IIS a esperarla.
¡Gracias por cualquier idea!
He oído que IIS reinicia 'sitios web' que requieren demasiada memoria ... –
Entiendo :) sin embargo, no creo que ese sea mi caso, como si esperara a que la tarea termine, IIS termina el ejecución y la entrada de registro se escribe el 100% de las veces – g3rv4
Como alternativa, podría simplemente utilizar una cola azul para iniciar sesión. Entonces, un manejador de mensajes separado puede escribir asincrónicamente en la tabla azul. Mejor aún, si obtiene un procesamiento de error, el mensaje permanece en la cola y se procesará nuevamente más tarde. –