2010-07-08 12 views
6

Quiero activar KillZombies todas las noches a medianoche. El problema que tengo es que el primer intervalo del temporizador se retiene y no se restablece a 86400000 milisegundos, como trato de hacer en mi método.Timer.Interval Pregunta

¿Hay alguna forma de eliminar el intervalo anterior y reemplazarlo por uno nuevo?

System.Timers.Timer Timer = new System.Timers.Timer(); 
Timer.Elapsed += new ElapsedEventHandler(KillZombies); 
Timer.Interval = MillisecondsToMidnight; 
Timer.Start() 

private void KillZombies(object source, ElapsedEventArgs e) 
{ 
//Kill zombies 
Timer.Interval = 86400000; //Milliseconds per 24 hours 
} 
+0

No estoy seguro de si esto es correcto o no, pero trataría de detenerlo, restablecer el intervalo y luego reiniciarlo. –

+0

@NickLarsen Habría vencido la respuesta aceptada si hubiera puesto esto como una respuesta en lugar de un comentario :-) – dotnetguy

Respuesta

9

Fwiw, al utilizar temporizadores, que siempre se establece la propiedad AutoReset-false. Esto evita que el temporizador se inicie de nuevo, por lo que debe llamar al Timer.Start() para que comience a contar nuevamente. Esto evitaría las llamadas adicionales a Stop()

Además, para ser explícito, tendría una función que calcula milisegundos hasta la medianoche cada vez y lo asigna al intervalo del temporizador cada vez. Haría su código más claro. Y también, si usa Timer.AutoRest = false, el temporizador no comenzará a contar hasta que llame al Timer.Start(), lo que significa que si pone la llamada Start() al final de su método KillZombies y ese método tarda 5 segundos en ejecutarse, su temporizador debe ser 86400000 - 5000 . Ese cambio de 5 segundos se sumaría con el tiempo.

+0

solo quería escribir lo mismo :-) –

+1

+1 por mencionar el error de acumulación –

+0

Error de acumulación, ni siquiera se me pasó por la cabeza. Cambiaré el código para recalcular milisegundos a medianoche cada vez. Gracias! – sooprise

1

Intente llamar Stop() primero, y luego Start() ing nuevo.

+0

Después de la línea: Timer.Interval = 86400000; ? – sooprise

+0

'Stop' before,' Start' after. – SLaks

+0

¿Puede explicar lo que está sucediendo cuando el cronómetro se detiene cuando se restablece el intervalo, en lugar de mantenerlo funcionando cuando se restablece el intervalo? – sooprise

4

Hmmmm ... me parece un problema de programación.

¿Por qué no algo un poco más adaptado a las tareas de programación como Quartz.NET? De esta forma, no tiene que preocuparse por configurar un temporizador para que se ejecute a medianoche y luego modificarlo más tarde.

Si está realmente en oposición a un marco de programación, usted podría intentar:

private void KillZombies(object source, ElapsedEventArgs e) 
{ 
    //Kill zombies 
    Timer.Stop(); 
    Timer.Interval = 86400000; //Milliseconds per 24 hours 
    Timer.Start(); 
} 
+0

Para mi proyecto actual, necesito que mi método kill killies simplemente funcione. No hay otras tareas programadas que deba ejecutar, por lo que utilizar un marco parece ser un poco exagerado para realizar un trabajo. Podría estar equivocado, pero ahora mismo, necesito hacer que esto funcione. Tendré en cuenta Quartz para futuros proyectos que requieran tareas intensivas de programación (lo cual es bastante probable). – sooprise

1

En lugar de utilizar un gran intervalo tal vez de ello utilizar un intervalo de quizá un segundo (o minutos) y se les DateTime.Now y si ha alcanzado el valor deseado, comience el trabajo.

System.Timers.Timer Timer = new System.Timers.Timer(); 
Timer.Elapsed += new ElapsedEventHandler(KillZombies); 
Timer.Interval = 60000; 
Timer.Start() 

private void KillZombies(object source, ElapsedEventArgs e) 
{ 
    if((DateTime.Now - DateTime.Today) < new TimeSpan(0, 1, 0)) 
    { 
     //ToDo: Kill Zombies 
    } 
}