2012-08-12 72 views
5

Encontré this answer y trato de seguir eso, pero no me dio ningún trabajo mientras comencé mi servicio. Una cosa que no pude entender es: `_timer = new Timer (10 * 60 * 1000); // cada 10 minutosPrograme un servicio de Windows C# para realizar una tarea a diario

Quiero realizar mi servicio diariamente a las 10:00 PM, ¿cómo podría hacerlo?

+0

Dependiendo de lo que intente ejecutar, podría ser mejor simplemente compilarlo como una aplicación de consola y hacer que el Programador de tareas de Windows lo ejecute siempre que lo desee. –

+0

@Nothing ¿puedes aceptar la respuesta de 'Adil'? que está funcionando bien y una buena solución también. :) Dado que esta pregunta está en la categoría sin respuesta. +1 a tu pregunta y a la respuesta de 'Adil'. Útil :))))., – RajeshKdev

Respuesta

7

Puede averiguar la difference entre current time y su desired schedule time y hacer que el intervalo transcurrido en consecuencia. De esta manera, el evento del temporizador will fire once en el momento previsto. Establezca el intervalo de tiempo en 24 horas cuando haya transcurrido.

private System.Timers.Timer _timer;  

private void SetTimer() 
{ 
    DateTime currentTime = DateTime.Now; 
    int intervalToElapse = 0; 
    DateTime scheduleTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 10,0,0); 

    if (currentTime <= scheduleTime) 
     intervalToElapse = (int)scheduleTime.Subtract(currentTime).TotalSeconds; 
    else 
     intervalToElapse = (int)scheduleTime.AddDays(1).Subtract(currentTime).TotalSeconds; 

    _timer = new System.Timers.Timer(intervalToElapse); 

    _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed); 
    _timer.Start(); 
} 

void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
     //do your work 
     _timer.Interval = (24 * 60 * 60 * 1000); 
} 
+1

¿Tengo que usar el método 'SetTimer' en' OnStart'? – Nothing

+2

Puede llamarlo donde quiera, pero al llamar a OnStart se asegurará de que no le falte la tarea de programación. Por ejemplo, su servicio comenzó a las 9:58 y luego debe llamarse para que el evento de temporizador transcurra en 10 – Adil

+1

¡Bueno!^____ ^ – Sai

1

Aunque el temporizador está sondeando cada diez minutos en la respuesta se hace referencia - su único procesamiento una vez al día:

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    // ignore the time, just compare the date 
    if (_lastRun.Date < DateTime.Now.Date) 
    { 

para que esto ocurra a las 10:00 AM añadir otra condición, por ejemplo:

_lastRun.Date < DateTime.Now.Date & & DateTime.Now.Hour = 10

Los diez minutos es el tiempo utilizado como frecuencia de sondeo.

+0

Entonces, ¿podría decirme qué significan esos 10 minutos? Gracias. – Nothing

+0

Por favor, mira mi edición. Si desea que el código lo ejecute en una tarea programada, simplemente tiene un exe que cuando comienza con un parámetro de línea de comando ejecuta el proceso, pero si hiciera doble clic en el archivo ejecutable, le mostraría las instrucciones sobre cómo ejecutarlo. sin supervisión: de esta forma las personas no patean accidentalmente un proceso cuando se preguntan qué hace el programa. –

3

Windows tiene un programador de tareas incorporado que es mucho mejor para usar para cualquier necesidad de programación. Hay muchas cosas que pueden salir mal cuando se trabaja con tareas de programación, como un reinicio del sistema, ahorros de luz diurna.

Puede referirse a un blog de Ayende sobre algunos de los problemas al crear su propio programador. Rotten scheduling: Don’t roll your own

4

En lugar de utilizar su propio temporizador, puede utilizar Quartz.NET para alojar el servicio. Funciona bien y tiene algunas características adicionales, como ponerse al día (si lo necesita), así como la capacidad de cultivar el servicio.

http://quartznet.sourceforge.net/

+0

hmm - esto suena bien pero eché un vistazo a la página y no tenía mucha información, ¿tiene un ejemplo de código? ** Editar ** - [lo encontré] (http://quartznet.sourceforge.net/tutorial/lesson_1.html) –

Cuestiones relacionadas