mvc filtro datos busqueda buscador c# asp.net-mvc

c# - filtro - Procesamiento en segundo plano basado en cola en la aplicación web ASP.NET MVC



filtro mvc c# (3)

Acabo de encontrar esta pregunta al buscar el proceso en segundo plano en ASP.NET MVC. (Disponible después de .NET 4.5.2)

public ActionResult InitiateLongRunningProcess(Emails emails) { if (ModelState.IsValid) { HostingEnvironment.QueueBackgroundWorkItem(ct => LongRunningProcessAsync(emails.Email)); return RedirectToAction("Index", "Home"); } return View(user); }

Nota: Personalmente no usaré el servidor web para ejecutar tareas en segundo plano. Además, no reinvente la rueda, recomendaría encarecidamente utilizar Hangfire .

Lea este excelente artículo de Hanselman HowToRunBackgroundTasksInASPNET

¿Cómo puedo implementar colas de procesamiento en segundo plano en mi aplicación web ASP.NET MVC? Si bien la mayoría de los cambios de datos, actualizaciones, etc., deben estar visibles de inmediato, hay otras actualizaciones que no requieren un procesamiento en tiempo real que me gustaría transferir a un proceso en segundo plano de prioridad más baja que lo cuidará a su propio ritmo .

Como ejemplo, tome el sistema de premios de distintivo de StackOverflow. Por lo general, puede tomar una acción específica que le otorgaría una credencial, pero el ''premio'' real ocurre más tarde (generalmente entre 10 minutos y un par de horas más tarde). Supongo que esto se realiza a través de un proceso de fondo por separado, ya que no es crítico para el trabajo de SO otorgar credenciales inmediatamente cuando se obtienen.

Por lo tanto, estoy tratando de crear algún tipo de sistema de colas en el que pueda rellenar tareas (diga algo que implemente la interfaz ITask que tendrá un método Process ()) que finalmente se ejecutará mediante un proceso separado.

¿Cómo haría para implementar un sistema así? Ideas / Sugerencia / Código de muestra?

¡Gracias!


Jeff tiene una excelente publicación que muestra cómo logró esto originalmente para en http://blog..com/2008/07/easy-background-tasks-in-aspnet/

Si bien puede que no sea tan confiable como un servicio si esa es una opción para usted, en el pasado me fue muy útil para tareas no esenciales, y lo he tenido trabajando en un entorno de alojamiento virtual.


Windows Services y MSMQ para comunicarse con ellos (si es necesario).

- editar

Para expandir ligeramente.

Creará varios servicios, dependiendo de lo que quiera hacer, y hará que todos ellos ejecuten un hilo interminable de varios niveles de sueño, para hacer lo que quiera. Luego actualizarán la base de datos de manera adecuada y no habrá tenido que hacer nada en el lado del cliente.

Es posible que desee interactuar con ellos desde el punto de vista de un administrador, por lo que puede tener un MSMQ en el que escuchen los comandos de administración. Dependiendo de su implementación, es posible que deba reiniciarlos por alguna razón, o posiblemente simplemente "forzar" una ejecución de lo que sea que quieran hacer.

Así que usarás una cola privada de MSMQ para hacerlo (espacio de nombres de System.Messaging). Una de las principales cosas a tener en cuenta sobre MSMQ es que el mensaje debe ser <4meg. Entonces, si pretende enviar gráficos de objetos grandes, primero serialice un archivo y simplemente envíe el nombre del archivo.

MSMQ es bastante hermoso. Puede enviarlo en función de un ''ID de correlación'' si lo necesita, pero, por algún motivo divertido, el ID de correlación debe tener la forma de:

{guid}/1

Cualquier otra cosa no funciona (al menos en la versión 2.0 del marco, el código puede haber cambiado).

- editar

Ejemplo, según lo solicitado:

using System.Messaging; ... MessageQueue queue = new MessageQueue(".//Private$//yourqueue"); queue.Formatter = new BinaryMessageFormatter(); Message m = new Message(); m.Body = "your serialisable object or just plain string"; queue.Send(m); // on the other side MessageQueue queue = new MessageQueue(".//Private$//yourqueue"); queue.Formatter = new BinaryMessageFormatter(); Message m = queue.Receive(); string s = m.Body as string; // s contains that string now