Pregunta

¿Cuál es la mejor implementación para más de un servicio en segundo plano en una aplicación ASP.NET?

  1. Devolución de llamada del temporizador

    Timer timer = new Timer(new TimerCallback(MyWorkCallback), HttpContext, 5000, 5000);
    
  2. Hilo o ThreadPool

    Thread thread = new Thread(Work);
    thread.IsBackground = true;
    thread.Start();
    
  3. BackgroundWorker

    BackgroundWorker worker = new BackgroundWorker(); 
    worker.DoWork += new DoWorkEventHandler(DoMyWork);
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(DoMyWork_Completed); 
    worker.RunWorkerAsync();
    
  4. Almacenamiento en caché como http://www.codeproject.com/KB/ aspnet / ASPNETService.aspx (ubicado en la publicación de Jeff Atwood aquí )

Necesito ejecutar múltiples "servicios" en segundo plano en un momento dado. Un servicio puede ejecutarse cada 5 minutos, mientras que otro puede ser una vez al día. Nunca se ejecutarán más de 10 servicios a la vez.

¿Fue útil?

Solución

Bueno, en lugar de un 'Hilo simple', irías por un ThreadPool.

Y si fuera yo, lo ejecutaría en un servicio de Windows y me comunicaría con él a través de MSMQ.

Otros consejos

Debe implementar algunos estados de tareas. Después de que la aplicación recicla, el servicio en segundo plano debe reparar las tareas rotas. Si las tareas están bajo transacciones, entonces no habrá problemas con ese comportamiento.

Ninguna de las sugerencias del póster original escala a más de un servidor.

Quiero lo mismo: Una manera robusta y fácil de usar de programar tareas regulares en segundo plano y realizar un procesamiento pesado ad-hoc (reconstruir cachés, etc.) sin afectar la solicitud de los usuarios actuales.

Quiero que las tareas se ejecuten en el contexto de las aplicaciones web, para a) obtener la configuración de web.config (evitar la duplicación de la configuración) yb) implementarla con la aplicación web (facilitar la implementación). Y necesito que funcione para sitios web distribuidos en más de un servidor.

Solo he encontrado un enfoque que proporciona algo de lo que quiero:

(1) Cree una página .aspx para cada tarea y configure una tarea programada wget en un servidor separado que llame a este .aspx en el sitio web. He implementado este enfoque y funciona, pero no me gusta al 100%, debido a la dependencia de la tarea programada y no me da la capacidad de realizar tareas pesadas ad hoc en segundo plano

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top