tasks scheduled quartz net job example c# scheduling

c# - scheduled - scheduler net



Correr una vez al día (6)

¿Hay algún método inteligente para que mi executeEveryDayMethod () se ejecute una vez al día, sin tener que involucrar a Windows TaskScheduler?

Saludos

/ Anders


Lo logré haciendo lo siguiente ...

  1. Configure un temporizador que se active cada 20 minutos (aunque el tiempo real depende de usted, tuve que correr en varias ocasiones a lo largo del día).
  2. en cada evento Tick, verifique la hora del sistema. Compare el tiempo con el tiempo de ejecución programado para su método.
  3. Si la hora actual es inferior a la hora programada, verifique en algún almacenamiento persistente para obtener el valor de fecha y hora de la última vez que se ejecutó el método.
  4. Si el método se ejecutó por última vez hace más de 24 horas, ejecute el método y guarde la fecha y hora de esta ejecución en su almacén de datos.
  5. Si el último método se ejecutó en las últimas 24 horas, ignóralo.

HTH

* edit - muestra del código en C # :: Nota: no probado ...

using System; using System.Collections.Generic; using System.Text; using System.Timers; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Timer t1 = new Timer(); t1.Interval = (1000 * 60 * 20); // 20 minutes... t1.Elapsed += new ElapsedEventHandler(t1_Elapsed); t1.AutoReset = true; t1.Start(); Console.ReadLine(); } static void t1_Elapsed(object sender, ElapsedEventArgs e) { DateTime scheduledRun = DateTime.Today.AddHours(3); // runs today at 3am. System.IO.FileInfo lastTime = new System.IO.FileInfo(@"C:/lastRunTime.txt"); DateTime lastRan = lastTime.LastWriteTime; if (DateTime.Now > scheduledRun) { TimeSpan sinceLastRun = DateTime.Now - lastRan; if (sinceLastRun.Hours > 23) { doStuff(); // Don''t forget to update the file modification date here!!! } } } static void doStuff() { Console.WriteLine("Running the method!"); } } }


Puede haber problemas si la computadora se reinicia para que pueda ejecutar la aplicación como un servicio de Windows.


Eche un vistazo a quartz.net . Es una biblioteca de programación para .net.

Más específicamente echa un vistazo aquí .


Puede consultar el tiempo y ejecutarlo dentro de un período de tiempo, de esa manera, incluso si la máquina se apaga, llamará al método o usará un temporizador como la sugerencia de Vinko.

Pero la mejor solución (similar a las versiones anteriores de CRON, por lo que es un patrón probado) es tener algunos datos persistentes, con la solución más barata que puedo pensar en este momento como un archivo en blanco, comprobar su último atributo modificado y si no lo ha hecho ha sido modificado en las últimas 24 horas, lo toca y ejecuta su método. De esta forma, se asegura que el método se ejecute a primera vista en el caso de que la aplicación salga el fin de semana, por ejemplo.

Ya he hecho esto en C #, pero fue hace un año en otro trabajo, así que no tengo el código, pero fueron unas 20 líneas (con comentarios y todo) más o menos.


Para ejecutar el trabajo una vez al día entre las 7 y las 8 p.m., configuro un temporizador con intervalo = 3600000 ms y luego ejecuto el siguiente código para el temporizador tic.

private void timer1_Tick(object sender, EventArgs e) { //ensure that it is running between 7-8pm daily. if (DateTime.Now.Hour == 19) { RunJob(); } }

Una ventana de una hora está bien para mí. La granularidad extra a tiempo requerirá un intervalo más pequeño en el temporizador (60000 por minuto) e incluir los minutos en el if.

p.ej

{ //ensure that it is running at 7:30pm daily. if (DateTime.Now.Hour == 19 && DateTime.Now.Minute == 30) { RunJob(); } }


Si el momento en que se ejecuta no es relevante y se puede restablecer cada vez que se inicia el programa, puede configurar un temporizador, que es lo más fácil de hacer. Si eso no es aceptable, comienza a volverse más complejo, como la solución presentada aquí y que aún no resuelve el problema de persistencia, debe abordarlo por separado si realmente desea hacer lo que haría Tareas programadas. Realmente consideraría de nuevo si vale la pena pasar por todos los problemas para replicar una funcionalidad existente perfectamente buena.

Aquí hay una pregunta relacionada (Ejemplo tomado de allí).

using System; using System.Timers; public class Timer1 { private static Timer aTimer = new System.Timers.Timer(24*60*60*1000); public static void Main() { aTimer.Elapsed += new ElapsedEventHandler(ExecuteEveryDayMethod); aTimer.Enabled = true; Console.WriteLine("Press the Enter key to exit the program."); Console.ReadLine(); } // Specify what you want to happen when the Elapsed event is // raised. private static void ExecuteEveryDayMethod(object source, ElapsedEventArgs e) { Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime); } }