tareas tarea programador programada net asp asp.net windows iis scheduled-tasks

asp.net - programada - programador de tareas en vb net



La mejor manera de ejecutar tareas programadas (16)

Además, si su aplicación utiliza el SERVIDOR SQL, puede usar el Agente SQL para programar sus tareas. Aquí es donde comúnmente ponemos el código recurrente que es impulsado por datos (recordatorios de correo electrónico, mantenimiento programado, purga, etc.). Una gran característica que está incorporada con el Agente SQL son las opciones de notificación de fallas, que pueden alertarle si una tarea crítica falla.

Hoy hemos creado una aplicación de consola para ejecutar las tareas programadas para nuestro sitio web ASP.NET. Pero creo que este enfoque es un poco propenso a errores y difícil de mantener. Cómo ejecuta su tarea programada (en un entorno Windows / IIS / ASP.NET)

Actualizar:

Ejemplos de tareas:

  • Envío de correo electrónico desde una cola de correo electrónico en la base de datos
  • Eliminar objetos obsoletos de la base de datos
  • Recuperar estadísticas de Google AdWords y completar una tabla en la base de datos.

Aquí hay otra manera:

1) Cree una secuencia de comandos web de "latido" que sea responsable de iniciar las tareas en caso de que deban estar vencidas o vencidas.

2) Cree un proceso programado en algún lugar (preferiblemente en el mismo servidor web) que llegue al webscript y lo obligue a ejecutarse en un intervalo regular. (p. ej., la tarea de programación de Windows que lanza silenciosamente el script heatbeat usando IE o whathaveyou)

El hecho de que el código de tarea esté contenido en un script web es simplemente para mantener el código dentro de la base de código de la aplicación web (se supone que ambos dependen de cada uno), lo que sería más fácil de administrar para los desarrolladores web .

El enfoque alternativo es crear un programa / script de servidor ejecutable que haga todo el trabajo de programación y ejecute el archivo ejecutable como una tarea programada. Esto puede permitir un desacoplamiento fundamental entre la aplicación web y la tarea programada. Por lo tanto, si necesita que sus tareas programadas se ejecuten incluso en el caso de que la aplicación / base de datos web esté inactiva o sea inaccesible, debe seguir este enfoque.


Crear un servicio de Windows personalizado .

Tenía algunas tareas de misión crítica configuradas como aplicaciones de consola programadas y las encontraba difíciles de mantener. Creé un servicio de Windows con un ''latido'' que verificaba un programa en mi base de datos cada dos minutos. Ha funcionado muy bien.

Dicho esto, todavía utilizo aplicaciones de consola programadas para la mayoría de mis tareas de mantenimiento no críticas. Si no está roto, no lo arregles.



He encontrado que esto es fácil para todos los involucrados:

  • Crear un método de servicio web como DoSuchAndSuchProcess
  • Crea una aplicación de consola que llame a este método web.
  • Programar la aplicación de la consola en el programador de tareas.

Al usar esta metodología, toda la lógica de negocios está contenida en su aplicación web, pero usted tiene la confiabilidad del administrador de tareas de Windows o de cualquier otro administrador de tareas comercial para comenzar y registrar cualquier información de devolución, como un informe de ejecución. Usar un servicio web en lugar de publicar en una página tiene un poco de ventaja porque es más fácil obtener datos de retorno de un servicio web.


He usado Abidar éxito en un proyecto ASP.NET (aquí hay Abidar ).

El único problema con este método es que las tareas no se ejecutarán si la aplicación web ASP.NET se descarga de la memoria (es decir, debido al bajo uso). Una cosa que intenté es crear una tarea para golpear la aplicación web cada 5 minutos, mantenerla activa, pero esto no parece funcionar de manera confiable, por lo que ahora estoy usando el programador de Windows y la aplicación de consola básica para hacer esto.

La solución ideal es crear un servicio de Windows, aunque esto podría no ser posible (es decir, si está utilizando un entorno de alojamiento compartido). También hace las cosas un poco más fáciles desde una perspectiva de mantenimiento para mantener las cosas dentro de la aplicación web.


No estoy seguro de qué tipo de tareas programadas quieres decir. Si te refieres a cosas como "cada hora, actualiza las tareas de tipo foo.xml", usa el sistema de tareas programadas de Windows. (El comando "a", oa través del controlador.) Pídale que ejecute una aplicación de consola o solicite una página especial que inicie el proceso.

Edición: debo agregar, esta es una forma correcta de hacer que su aplicación IIS se ejecute en los puntos programados también. Supongamos que desea revisar su base de datos cada 30 minutos y enviar recordatorios por correo electrónico a los usuarios sobre algunos datos, puede usar las tareas programadas para solicitar esta página y, por lo tanto, obtener el procesamiento de IIS.

Si sus necesidades son más complejas, podría considerar crear un Servicio de Windows y hacer que se ejecute un ciclo para hacer cualquier procesamiento que necesite. Esto también tiene la ventaja de separar el código para fines de escalado o administración. En el lado negativo, necesita lidiar con los servicios de Windows.


Por qué reinventar la rueda, use la clase de Roscado y el Temporizador.

protected void Application_Start() { Thread thread = new Thread(new ThreadStart(ThreadFunc)); thread.IsBackground = true; thread.Name = "ThreadFunc"; thread.Start(); } protected void ThreadFunc() { System.Timers.Timer t = new System.Timers.Timer(); t.Elapsed += new System.Timers.ElapsedEventHandler(TimerWorker); t.Interval = 10000; t.Enabled = true; t.AutoReset = true; t.Start(); } protected void TimerWorker(object sender, System.Timers.ElapsedEventArgs e) { //work args }


Puede crear fácilmente un servicio de Windows que ejecute código en intervalos usando el método ''ThreadPool.RegisterWaitForSingleObject''. Es realmente elegante y bastante fácil de configurar. Este método es un enfoque más simplificado que el uso de cualquiera de los temporizadores en el marco.

Echa un vistazo al siguiente enlace para obtener más información:

Ejecutando un proceso periódico en .NET usando un servicio de Windows:
http://allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html


Si es propietario del servidor, debe utilizar el programador de tareas de Windows. Utilice AT /? Desde la línea de comandos para ver las opciones.

De lo contrario, desde un entorno basado en web, es posible que tenga que hacer algo desagradable, como configurar una máquina diferente para realizar solicitudes a una determinada página en un intervalo de tiempo.


Todas mis tareas (que deben ser programadas) para un sitio web se mantienen dentro del sitio web y se llaman desde una página especial. Luego escribí un simple servicio de Windows que llama a esta página de vez en cuando. Una vez que la página se ejecuta, devuelve un valor. Si sé que hay más trabajo por hacer, vuelvo a ejecutar la página de inmediato, de lo contrario, lo hago en poco tiempo. Esto me ha funcionado muy bien y mantiene toda la lógica de mis tareas con el código web. Antes de escribir el servicio simple de Windows, usé el programador de Windows para llamar a la página cada x minutos.

Otra forma conveniente de ejecutar esto es usar un servicio de monitoreo como Pingdom . Apunte su cheque http a la página que ejecuta su código de servicio. Haga que la página devuelva resultados que luego se pueden usar para activar Pingdom para enviar mensajes de alerta cuando algo no está bien.


Una nueva biblioteca de clases del programador de tareas para .NET

Nota: desde que se creó esta biblioteca, Microsoft ha introducido un nuevo programador de tareas (Task Scheduler 2.0) para Windows Vista. Esta biblioteca es un contenedor para la interfaz del Programador de tareas 1.0, que todavía está disponible en Vista y es compatible con Windows XP, Windows Server 2003 y Windows 2000.

http://www.codeproject.com/KB/cs/tsnewlib.aspx


Una opción sería configurar un servicio de Windows y hacer que llame a su tarea programada.

En los formularios de Windows que he usado, los temporizadores no creen que esto funcione bien en ASP.NET


Usa el Programador de Windows para ejecutar una página web.

Para evitar que el usuario malicioso o las arañas de los motores de búsqueda lo ejecuten, cuando configure la tarea programada, simplemente llame a la página web con una cadena de consulta, es decir: mypage.aspx? From = scheduletask

Luego, en la carga de la página, simplemente use una condición: if (Request.Querystring ["from"] == "scheduletask") {// executetask}

De esta manera, ningún motor de búsqueda o usuario malintencionado podrá ejecutar la tarea programada.


Usamos aplicaciones de consola también. Si usa herramientas de registro como Log4net, puede monitorear adecuadamente su ejecución. Además, no estoy seguro de que sean más difíciles de mantener que una página web, dado que es posible que esté compartiendo algunas de las mismas bibliotecas de códigos entre las dos si está diseñada correctamente.

Si está en contra de que esas tareas se ejecuten de manera cronometrada, podría tener una página web en su sección administrativa de su sitio web que actúe como una cola. El usuario coloca una solicitud para ejecutar la tarea, a su vez inserta un registro de marca de datos en blanco en la tabla MyProcessQueue y su tarea programada está revisando cada X minutos un nuevo registro en MyProcessQueue. De esa manera, solo se ejecuta cuando el cliente quiere que se ejecute.

Espero que esas sugerencias ayuden.


Esta técnica de Jeff Atwood para es el método más simple que he encontrado. Se basa en el mecanismo de devolución de llamada de "elemento de caché eliminado" incorporado en el sistema de caché de ASP.NET

Actualización: ha superado este método. Solo funciona mientras se ejecuta el sitio web, pero es una técnica muy simple que es útil para muchas personas.

También Quartz.NET ver Quartz.NET