23 votos

Basada en cola de Procesamiento en segundo plano en ASP.NET MVC Aplicación Web

¿Cómo puedo implementar el procesamiento en segundo plano colas en mi ASP.NET MVC web app? Mientras que la mayoría de los cambios de datos, actualizaciones, etc. deben ser visibles inmediatamente, hay otras actualizaciones que no necesitan el procesamiento en tiempo real que me gustaría entregar a un menor prioridad de proceso en segundo plano que va a tomar el cuidado de él a su propio ritmo.

Como un ejemplo, tomar StackOverflow insignia del sistema de adjudicación. Por lo general, usted puede tomar una acción específica que otorgaría una insignia, pero el 'premio' que sucede más adelante (típicamente entre 10 minutos y un par de horas más tarde). Supongo que esto se hace a través de un proceso en segundo plano independiente, ya que no es crítico para el MODO de funcionamiento para otorgar insignias de inmediato al ganado.

Por lo tanto, estoy tratando de crear algún tipo de sistema de cola en el que yo podría rellenar las tareas (por decir algo la implementación de ITask interfaz que tendrá un método Process ()) que eventualmente se ejecutan en un proceso separado.

Cómo se podría ir sobre la implementación de dicho sistema? Ideas/Sugerencia/Código De Ejemplo?

Gracias!

17voto

Noon Silk Puntos 30396

Los Servicios de Windows y MSMQ para comunicarse con ellos (si se necesita).

-- Edit

Para aumentar ligeramente el tamaño.

Podrás crear varios servicios, dependiendo de lo que quieres hacer, y que todos ellos ejecutar un interminable hilo de varios dormir niveles, para hacer lo que quieres. Luego de la actualización de la base de datos de forma adecuada, y no han tenido que hacer nada en el lado del cliente.

Usted puede desear para interactuar con ellos de un administrador punto de vista, por lo tanto, usted puede tener un MSMQ que escucha a los comandos de admin. Dependiendo de su aplicación, es posible que deba reiniciar ellos por alguna razón, o, posiblemente, sólo la "fuerza" de una ejecución de cualquier actividad que deseen realizar.

Así que tendrás que usar un MSMQ Privado Cola para hacerlo (el Sistema.Mensajería espacio de nombres). Una de las principales cosas a tener en cuenta acerca de MSMQ, es que el mensaje necesita ser < 4meg. Así que si usted tiene la intención de enviar grandes gráficos de objetos, serialise a un archivo primero y sólo tiene que enviar el nombre de archivo.

MSMQ es muy hermosa. Usted puede enviar basada en un " IDENTIFICADOR de Correlación,' si usted necesita, pero, para algunas divertidas razón, el IDENTIFICADOR de correlación debe ser en forma de:

{guid}\1

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

-- Edit

Ejemplo, como se pide:

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

7voto

rjt Puntos 114

Jeff tiene un gran post que muestra cómo logró este originalmente por Stack Overflow en http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

Si bien puede no ser tan fiable como un servicio, si esa es una opción para usted, me sirvió de mucho en el pasado para no tareas esenciales, y he tenido que trabajar en un entorno de hospedaje virtual.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: