Como reiniciar um temporizador em C#?

Há três classes que eu conheço., System.Threading.Timer, System.Timers.Timer, e System.Windows.Forms.Timer, mas nenhum destes tem uma função .Reset() que iria repor o tempo decorrido para 0.

Existe uma classe BCL que tem esta funcionalidade? Há alguma forma de o fazer? (Eu pensei que, talvez, alterar o limite de tempo pode redefini-la) Pensei no quão difícil seria implementar um Timer a classe que tinha essa funcionalidade, ou como fazê-lo de forma confiável com um dos BCL aulas?

 95
Author: Matthew Scharley, 2009-06-25

10 answers

Faço-o sempre ...

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

... isso é uma invasão? :)

Por Comentário, sobre roscagem.Temporizador, é o método de alteração...

DueTime Type: System.Int32 The tempo de atraso antes da invocar o método de callback indicado quando o temporizador foi construído, em milissegundo. Especificar {[2] } para evitar a o temporizador do recomeço. Indicar zero (0) reiniciar o temporizador imediatamente.

 122
Author: JP Alioto, 2009-06-25 05:40:18

Todos os cronómetros têm o equivalente aos métodos Start() e Stop (), excepto o sistema.Roscar.Temporizador.

Então um método de extensão como...

public static void Reset(this Timer timer)
{
  timer.Stop();
  timer.Start();
}
...É uma forma de o fazer.
 49
Author: Dan, 2012-07-29 17:19:08

Para System.Timers.Timer, de acordo com a documentação MSDN, http://msdn.microsoft.com/en-us/library/system.timers.timer.enabled.aspx:

Se o intervalo for definido após o início do temporizador, a contagem é redefinir. Por exemplo, se você definir o intervalo para 5 segundos e, em seguida, definir a propriedade activa é verdadeira, pelo que a contagem começa na altura activa é definir. Se reiniciar o intervalo para 10 segundos quando a contagem for de 3 segundos, o evento decorrido é elevado pela primeira vez 13 segundos depois Activo foi definido como verdadeiro.

Então,
    const double TIMEOUT = 5000; // milliseconds

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

    :
    :

    aTimer.Interval = TIMEOUT;  // restart the timer
 22
Author: mMontu, 2011-08-12 20:06:17

Você poderia escrever um método de extensão chamado Reset (), que

  • paragem de chamadas()-início() para Temporizadores.Temporizador e formulários.Temporizador
  • As chamadas mudam para rosca.Temporizador
 6
Author: Gishu, 2018-01-28 04:43:55
Acabei de atribuir um novo valor ao temporizador.
mytimer.Change(10000, 0); // reset to 10 seconds
Para mim, funciona bem.

No topo do Código defina o 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
    }
 3
Author: Quispie, 2012-11-22 13:04:04

Para um temporizador (sistema.Janela.Formulario.Temporizador).

O .Então pára .Os métodos iniciais funcionaram como um reset.

 2
Author: elmsoftware, 2010-06-29 19:34:12

Para maior clareza, dado que alguns outros comentários estão incorrectos, ao usar a opção System.Timers activada para true irá repor o tempo decorrido. Acabei de testar o comportamento com o seguinte:

Timer countDown= new Timer(3000);

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");
}

Eu introduziria o texto no campo de texto repetidamente e o temporizador só funcionaria 3 segundos após a última tecla. É sugerido nos docs também, como você verá: chamando Timers.Start() apenas sets habilitados a verdade.

E para ter a certeza, ao qual eu devia ter ido logo desde o início., você verá na fonte de referência . net que se ativar um temporizador já ativado ele chama o método privado UpdateTimer(), que internamente chama Change().
 2
Author: NickSpag, 2018-09-18 21:45:15

Outra forma alternativa de reiniciar as janelas.o temporizador está a usar o contador, como se segue:

int tmrCtr = 0;
Timer mTimer;

private void ResetTimer()
{
  tmrCtr = 0;
}

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

Por isso, se pretender repetir a cada 1 segundo, pode definir o intervalo do temporizador em 100ms, e testar o contador em 10 ciclos.

Isto é adequado se o temporizador deve esperar por alguns processos que podem ser terminados no intervalo de tempo diferente.

 1
Author: ivan, 2011-09-19 21:58:57

Eu faço isto

//Restart the timer
queueTimer.Enabled = true;
 1
Author: Rissa, 2014-06-03 13:06:24

Podes fazer timer.Interval = timer.Interval

 0
Author: Ella Shar, 2015-08-26 18:43:50