2011-04-21 24 views
11

Estoy usando un System.Timers.Timer y tengo un código como el siguiente en mi método OnStart en un servicio C# windows.Fire timer_elapsed inmediatamente desde OnStart en el servicio de Windows

timer = new Timer(); 
timer.Elapsed += timer_Elapsed; 
timer.Enabled = true; 
timer.Interval = 3600000; 
timer.Start(); 

Esto hace que el código en timer_Elapsed que se ejecutará cada hora a partir de una hora después de iniciar el servicio. ¿Hay alguna forma de que se ejecute en el punto en que empiezo el servicio y luego cada hora?

El método llamado por timer_Elapsed tarda demasiado en ejecutarse para llamarlo directamente desde OnStart.

+0

Cualquier problema si lo llama después del temporizador.Inicio()? – V4Vendetta

Respuesta

19

Simplemente inicie un subproceso de subprocesos para llamar a la función de trabajo, al igual que lo hace el temporizador. De esta manera:

 timer.Elapsed += timer_Elapsed; 
     ThreadPool.QueueUserWorkItem((_) => DoWork()); 
    ... 

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { 
     DoWork(); 
    } 

    void DoWork() { 
     // etc... 
    } 
1

clase Uso System.Threading.Timer en lugar de System.Timers.Timer ya que este tipo es sólo un envoltorio para el roscado de temporizador.

También se adapta a sus necesidades.

System.Threading.Timer timer = 
       new System.Threading.Timer(this.DoWork, this, 0, 36000); 

Here son los detalles.

+0

Lo hice pero aquí al menos no funcionó. Ejecuta el método justo antes de que se inicie la hora, pero se ejecuta dentro de onStart(). – Thiago

2

Utilice la propiedad AutoReset de System.Timers.Timer y establezca su valor en "true". No es necesario utilizar timer.Start() porque hace el mismo trabajo que timer.Enabled = true;

timer = new Timer(); 
timer.Elapsed += timer_Elapsed; 
timer.Enabled = true; 
timer.Interval = 3600000; 
timer.AutoReset = true; 

AutoReset = true fijará un valor que indica que el temporizador debe provocar el evento cada vez transcurrido el intervalo especificado cuando transcurre el tiempo.

0

Si desea que su Timer a ser despedido inmediatamente a continuación, usted podría simplemente inicializar el objeto Timer sin un intervalo especificado (tomará por omisión 100 ms, que es casi de inmediato: P), a continuación, establecer el intervalo dentro de la llamada de función a lo te gusta. Aquí hay un ejemplo de lo que uso en mi servicio de Windows:

private static Timer _timer; 

protected override void OnStart(string[] args) 
{ 
    _timer = new Timer(); //This will set the default interval 
    _timer.AutoReset = false; 
    _timer.Elapsed = OnTimer; 
    _timer.Start(); 
} 

private void OnTimer(object sender, ElapsedEventArgs args) 
{ 
    //Do some work here 
    _timer.Stop(); 
    _timer.Interval = 3600000; //Set your new interval here 
    _timer.Start(); 
} 
Cuestiones relacionadas