A ma connaissance, il existe trois classes Timer
: System.Threading.Timer
, System.Timers.Timer
Et System.Windows.Forms.Timer
, Mais aucune de ces classes n'a un .Reset()
fonction qui remettrait le temps écoulé actuel à 0.
Existe-t-il une classe BCL dotée de cette fonctionnalité? Y a-t-il un moyen de le faire sans hack? (Je pensais que peut-être changer la limite de temps pourrait la réinitialiser) Pensée à quel point il serait difficile de réimplémenter une classe Timer
qui avait cette fonctionnalité, ou comment le faire de manière fiable avec l’une des classes BCL?
Je fais toujours ...
myTimer.Stop();
myTimer.Start();
... Est-ce un hack? :)
Par commentaire, sur Threading.Timer, c'est le Changer de méthode ...
dueTime Type:
System.Int32
Délai, en millisecondes, avant l'appel de la méthode de rappel spécifiée lors de la construction du minuteur. SpécifiezTimeout.Infinite
pour empêcher la minuterie de redémarrer. Spécifiez zéro (0) pour redémarrer le chronomètre immédiatement.
Tous les minuteurs ont l'équivalent des méthodes Start () et Stop (), à l'exception de System.Threading.Timer.
Donc, une méthode d'extension telle que ...
public static void Reset(this Timer timer)
{
timer.Stop();
timer.Start();
}
... est une façon de s'y prendre.
Pour System.Timers.Timer
, selon la documentation MSDN, http://msdn.Microsoft.com/en-us/library/system.timers.timer.enabled.aspx :
Si l'intervalle est défini après le démarrage de la minuterie, le compte est réinitialisé. Par exemple, si vous définissez l'intervalle sur 5 secondes, puis que vous définissez la propriété Enabled sur true, le décompte commence au moment où le paramètre Enabled est défini. Si vous réinitialisez l'intervalle à 10 secondes lorsque le nombre est égal à 3 secondes, l'événement Elapsed est déclenché pour la première fois 13 secondes après que le paramètre Enabled a été défini sur true.
Alors,
const double TIMEOUT = 5000; // milliseconds
aTimer = new System.Timers.Timer(TIMEOUT);
aTimer.Start(); // timer start running
:
:
aTimer.Interval = TIMEOUT; // restart the timer
Vous pouvez écrire une méthode d’extension appelée Reset (), qui
Je viens d'attribuer une nouvelle valeur à la minuterie:
mytimer.Change(10000, 0); // reset to 10 seconds
ça fonctionne bien pour moi.
en haut du code définissez le timer: 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
}
Pour plus de clarté, car d’autres commentaires sont incorrects. Lorsque vous utilisez System.Timers
, Le paramètre Activé sur true réinitialisera le temps écoulé. Je viens de tester le comportement avec ce qui suit:
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");
}
Je saisis le texte dans la zone de texte à plusieurs reprises et le chronomètre ne fonctionnait que 3 secondes après la dernière frappe. Vous le verrez également dans la documentation, comme vous le verrez: appeler Timers.Start()
définit simplement Enabled sur true.
Et pour être sûr, ce que j'aurais dû faire tout droit du début, vous verrez dans le source de référence .NET que si l'activation d'un minuteur déjà activé, il appelle le privé UpdateTimer()
, qui appelle en interne Change()
.
Pour une minuterie (System.Windows.Forms.Timer).
Les méthodes .Stop, puis .Start ont fonctionné comme une réinitialisation.
Une autre méthode alternative pour réinitialiser windows.timer consiste à utiliser le compteur, comme suit:
int tmrCtr = 0;
Timer mTimer;
private void ResetTimer()
{
tmrCtr = 0;
}
private void mTimer_Tick()
{
tmrCtr++;
//perform task
}
Ainsi, si vous avez l’intention de répéter toutes les secondes, vous pouvez régler l’intervalle de minuterie à 100 ms et tester le compteur à 10 cycles.
Cela convient si le minuteur doit attendre que certains processus s’arrêtent à une heure différente.
Tu peux faire timer.Interval = timer.Interval
je fais ça
//Restart the timer
queueTimer.Enabled = true;