2009-06-25 55 views
87

Hay tres clases Timer que yo sepa, System.Threading.Timer, System.Timers.Timer, y System.Windows.Forms.Timer, pero ninguno de estos tienen una función .Reset() que restablecer el tiempo transcurrido actual a 0.¿Cómo reiniciar un temporizador en C#?

¿Hay una clase que tiene este BCL funcionalidad? ¿Hay alguna forma de hacerlo? (Pensé que tal vez cambiar el límite de tiempo podría restablecerlo). ¿Pensó en lo difícil que sería volver a implementar una clase Timer que tenía esta funcionalidad, o cómo hacerlo de manera confiable con una de las clases BCL?

+3

Utilizando la solución de JP use un método de extensión – benPearce

+0

Yo también tengo la misma necesidad de reinicio y por las mismas razones mencionadas, FileSystemWatcher es desagradable e inconveniente de usar –

+0

Si usa Cronómetro para un temporizador y elige el método de extensión, sea cuidado porque el método de extensión Stopwatch.Restart viene en .NET 4.0. http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.restart(VS.100,lightweight).aspx – si618

Respuesta

113

siempre lo hago ...

myTimer.Stop(); 
myTimer.Start(); 

... es que un truco? :)

por comentario, en Threading.Timer, es el tipo Change method ...

dueTime: System.Int32 El cantidad de tiempo de retraso antes de que el invocando el método de devolución de llamada especificado cuando el temporizador estaba construido, en milisegundos. Especifique Timeout.Infinite para evitar que el temporizador se reinicie. Especifique cero (0) para reiniciar el temporizador inmediatamente.

+0

El otro problema es que solo woeks con Forms.Timer, y mi aplicación no tiene GUI (Application.Start() sin parámetros), así que PIENSO que la clase Threading.Timer es mejor por otras razones, pero es un buen punto. –

+3

@Matthew: consulte http://msdn.microsoft.com/en-us/magazine/cc164015.aspx para obtener una descripción de las distintas clases de temporizador y, cuando las utilice, es apropiado. En general, sin embargo, 'Forms.Timer' solo debe usarse con una GUI. Sin embargo, además de 'Forms.Timer' y' Threading.Timer' también hay 'Timers.Timer'. – Brian

44

Todos los temporizadores tienen el equivalente de los métodos Start() y Stop(), excepto System.Threading.Timer.

lo tanto un método de extensión tales como ...

public static void Reset(this Timer timer) 
{ 
    timer.Stop(); 
    timer.Start(); 
} 

... es una manera de hacerlo.

+1

No estoy buscando medir el tiempo transcurrido. Mi caso de uso exacto para esto es que tengo un FileSystemWatcher mirando un directorio y quiero ver grupos de cambios (es decir, cambios realizados dentro de, por ejemplo, 5s el uno del otro). La teoría es que el primer cambio inicia un temporizador que se restablece con cada cambio hasta que finalmente se dispara y cierra el grupo. –

+0

Sí, lo vi cuando volví a leer tu pregunta. Editado mi respuesta. – Dan

4

Se podría escribir una llamada de reinicio método de extensión(), que

  • llama Stop() - Inicio() para Timers.Timer y Forms.Timer
  • llamadas cambio para Threading.Timer
1

Otra forma alternativa para restablecer el windows.timer es utilizando el contador, como sigue:

int tmrCtr = 0; 
Timer mTimer; 

private void ResetTimer() 
{ 
    tmrCtr = 0; 
} 

private void mTimer_Tick() 
{ 
    tmrCtr++; 
    //perform task 
} 

Por lo tanto, si tiene la intención de repetir cada 1 segundo, puede establecer el intervalo del temporizador a 100 ms y probar el contador a 10 ciclos.

Esto es adecuado si el temporizador debe esperar algunos procesos que pueden finalizar en el intervalo de tiempo diferente.

2

Para un temporizador (System.Windows.Forms.Timer).

Los métodos .Stop y luego .Start funcionaron como un restablecimiento.

19

Para System.Timers.Timer, según la documentación de MSDN, http://msdn.microsoft.com/en-us/library/system.timers.timer.enabled.aspx:

Si el intervalo se establece después de que el temporizador ha comenzado, el recuento es reinicio.Por ejemplo, si establece el intervalo en 5 segundos y luego establece la propiedad Habilitada en verdadero, el recuento comienza en el momento en que Habilitado está establecido. Si restablece el intervalo a 10 segundos cuando el recuento es de 3 segundos, el evento transcurrido se activa por primera vez 13 segundos después de que Habilitado se configuró en verdadero.

Así,

const double TIMEOUT = 5000; // milliseconds 

    aTimer = new System.Timers.Timer(TIMEOUT); 
    aTimer.Start();  // timer start running 

    : 
    : 

    aTimer.Interval = TIMEOUT; // restart the timer 
+1

El problema aquí es que no siempre sabe en el momento en que desea restablecer si el temporizador ya se está ejecutando o no. Entonces, tendrías que hacer aTimer.Interval = TIMEOUT y a aTimer.Start(). Entonces, en general, una función de reinicio anterior usa menos líneas y variables. Gran adición sin embargo. –

+1

@ R-U-Bn El OP indica claramente "* a. Reiniciar() función que restablecería el tiempo transcurrido actual a 0 *."- no menciona que está destinado a usarse en una aplicación de diseño pobre en la que ni siquiera se sabe si el temporizador se está ejecutando. También revise el comentario del autor (hace más de 4 años):" * La teoría es que el primer cambio inicia un temporizador que se restablece con cada cambio hasta que finalmente se dispara y cierra el grupo. * "Gracias por el voto negativo, de todos modos. – mMontu

+0

No importa, es solo información extra para otras personas. PD No lo hice Solo bajé mi voto anterior. Acabo de recuperar mi voto. PPS No te subas a tu caballo tan fácilmente. –

3

acabo asigna un nuevo valor para el temporizador:

mytimer.Change(10000, 0); // reset to 10 seconds 

funciona bien para mí.

en la parte superior del código definen el temporizador: System.Threading.Timer myTimer;

if (!active) 
     { 
      myTimer= new System.Threading.Timer(new TimerCallback(TimerProc)); 
     } 
     myTimer.Change(10000, 0); 
     active = true; 

private void TimerProc(object state) 
    { 
     // The state object is the Timer object. 
     System.Threading.Timer t = (System.Threading.Timer)state; 
     t.Dispose(); 
     Console.WriteLine("The timer callback executes."); 
     active = false; 
     //action to do when timer is back to zero 
    } 
0

hago esto

//Restart the timer 
queueTimer.Enabled = true; 
+0

Esto simplemente lo habilita. Incluso si se deshabilitó de antemano, la reactivación no cambia el tiempo transcurrido que se había recogido hasta ese punto. – vapcguy

0

Usted puede hacer timer.Interval = timer.Interval

0

Para mayor claridad, ya que algunos otros comentarios son incorrectos, cuando utilizando System.Timers configuración Habilitada en verdadero restablecerá el tiempo transcurrido. Acabo de probar el comportamiento con el siguiente:

Timer countDown= new Timer(); 

Main() 
{ 
    TextBox.TextDidChange += TextBox_TextDidChange; 
    countdown.Elapsed += CountDown_Elapsed; 
} 

void TextBox_TextDidChange(Object sender, EventArgs e) 
{ 
    countdown.Enabled = true; 
} 

void CountDown_Elapsed(object sender, EventArgs e) 
{ 
    System.Console.WriteLine("Elapsed"); 
} 

lo haría texto de entrada a la caja de texto en varias ocasiones y el temporizador sólo iría en 3 segundos después de la última pulsación de tecla. También se insinúa en los documentos, como verá llamando a 'Timers.Start()' simplemente establece Enabled en true.

Y para estar seguro, que debería haber ido directamente desde el principio, verá en el .NET reference source que si habilita un temporizador ya habilitado llama al método privado UpdateTimer(), que internamente llama Cambio ()