Controladores asíncronos (MVC), proceso de larga ejecución con “paradas”

Estoy interesado en ejecutar un proceso largo, quiero actualizar la interfaz de usuario tan pronto como empiecen a llegar los resultados y no esperar a que finalice.

¿Cómo voy a hacer esto? He leído acerca de los controladores Async pero parece que no tienen nada incorporado para este propósito.

¿Simplemente guarda los resultados en el objeto Aplicación / Sesión a medida que llegan los resultados y utiliza el sondeo desde el lado del cliente? Puedo pensar en varias formas en las que podría salir mal (como si el usuario cerrara la página y el objeto permanezca en el objeto Aplicación para siempre, necesito administrar la caducidad de este objeto yo mismo, carga adicional del servidor para sondeo, etc.).

¿Alguna idea?

Gracias

Intenté resolver algo similar (reportando el progreso en tiempo real de una operación de servidor de larga ejecución al cliente) recientemente y resultó que SignalR es el ajuste perfecto para esta situación.

Básicamente, se trata de una biblioteca que incluye un sondeo largo y sockets web, utilizando (de forma transparente) lo que esté disponible en el servidor y el cliente.

Solo tengo buena experiencia con eso hasta ahora.

Puede ejecutar la tarea de ejecución larga utilizando ThreadPool.QueueUserWorkItem y puede actualizar el estado en Aplicación / Sesión que el usuario puede sondear. Como usted señaló, tiene algunos problemas de por vida. Más allá de lo que señalaste, el grupo de aplicaciones podría reciclarse, pero quizás eso esté bien.

¿Cuál es el scope lógico de esa operación? ¿Es una tarea de ejecución de tipo de sistema en la que alguien / muchas personas necesitan consultar el progreso? ¿O es una tarea de larga duración en nombre de un usuario específico? Si es lo último, entonces está bien si la sesión de ese usuario se agota, etc. Si es lo primero, entonces necesita ser más duradero. por ejemplo, podría almacenar la solicitud de tarea, el estado y el progreso en una base de datos. De esa manera, al reiniciar la aplicación, puede simplemente retomarla en cualquier momento y es fácil de consultar por cualquier persona (un punto de decisión importante si se trata de una tarea a nivel del sistema).

La consideración final es si alguna vez tendrá más de una función web (granja / clúster web). Si eso alguna vez es más importante que una base de datos o incluso un rol / servicio de trabajador independiente, se vuelve más apropiado.

Entonces, todo se reduce al tipo de tarea que es, quién necesita monitorearlo y cuáles son los requisitos de durabilidad. Si solo es una tarea del usuario, manténgalo simple, queueuserworkitem y el estado de la sesión.

Este artículo parece describir lo que desea, simple y sin SeñalR:

ASP.NET MVC 3: indicador de progreso de jQuery asíncrono para tareas de larga ejecución

Controlador:

HomeController de clase pública: Controlador {tareas de IDictionary estático privado = diccionario nuevo ();

public ActionResult Index() { return View(); } public ActionResult Start() { var taskId = Guid.NewGuid(); tasks.Add(taskId, 0); Task.Factory.StartNew(() => { for (var i = 0; i <= 100; i++) { tasks[taskId] = i; // update task progress Thread.Sleep(50); // simulate long running operation } tasks.Remove(taskId); }); return Json(taskId); } public ActionResult Progress(Guid id) { return Json(tasks.Keys.Contains(id) ? tasks[id] : 100); } 

}

Ver:

  

});