2011-03-01 8 views
5

Tenemos algunas operaciones de larga ejecución disparando cuando el usuario hace algo (generando varios informes). No queremos que el usuario espere hasta que se hayan generado esos informes. ¿Hay una manera rápida de lograr esto sin tener que implementar un planificador de trabajos? Tal vez usando hilos como este? ¿O esto no es seguro?No espere operaciones longrunning ASP.NET MVC

public ActionResult About() 
    { 
     Thread thread = new Thread(new ThreadStart(MuchWork)); 
     thread.Start(); 
     return View(); 
    } 

    public void MuchWork() 
    { 
     Thread.Sleep(10000); 

     Thread.Sleep(4000); 
    } 

Respuesta

0

No es seguro. ¿Qué pasa con el bloqueo de tu servidor durante la operación? Y el usuario que no sabía que la operación nunca se realizó.

En general, un mecanismo de flujo de trabajo/persistente ayudaría con eso, pero realmente tiene que pensar en su caso de experiencia empresarial/usuario para escenarios catastróficos aquí.

+0

con inseguro me refiero a si es posible que el subproceso asincrónico esté dispuesto por IIS cuando la solicitud de llamada ha finalizado durante un tiempo. De hecho, será necesario tener una buena gestión/registro de excepciones. En nuestra situación, no sería desastroso si el servidor fallara ya que el usuario vería que su informe no está allí. – MichaelD

0

¿Quizás use el threadpool, o TPL para que pueda verificar el estado y no obtener un abuso de hilos? con 'comprobar' me refiero a ver cuántas de estas solicitudes ya tiene en ejecución antes de hacer girar otra.

¿Cómo saber que el resultado de la operación está escrito en alguna tabla DB, por lo que el usuario puede sondear y ver el estado?

+0

sí, el resultado son los informes almacenados en la base de datos, el usuario puede ver esos informes cuando estén disponibles. – MichaelD

+0

Puede lograr esto usando llamadas Async. No creo que el enhebrado sea necesario en base a tu ejemplo. Sin embargo, me puede estar perdiendo la gran imagen ... Pero creo firmemente que esto se puede lograr con las llamadas Async. – sajoshi

+0

Las llamadas asíncronas siguen bloqueándose para la solicitud actual. Si entendí correctamente, las llamadas asincrónicas están hechas para la escalabilidad, no para tiempos de respuesta más rápidos para el hilo actual. (la vista se devuelve cuando se completa la llamada asincrónica) – MichaelD