Como reiniciar um temporizador em C#?
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?
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.
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.
Para System.Timers.Timer
, de acordo com a documentação MSDN, http://msdn.microsoft.com/en-us/library/system.timers.timer.enabled.aspx:
Então,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.
const double TIMEOUT = 5000; // milliseconds
aTimer = new System.Timers.Timer(TIMEOUT);
aTimer.Start(); // timer start running
:
:
aTimer.Interval = TIMEOUT; // restart the timer
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
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
}
Para um temporizador (sistema.Janela.Formulario.Temporizador).
O .Então pára .Os métodos iniciais funcionaram como um reset.
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.
UpdateTimer()
, que internamente chama Change()
.
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.
Eu faço isto
//Restart the timer
queueTimer.Enabled = true;
Podes fazer timer.Interval = timer.Interval