Je sais que cela semble stupide, mais j'ai tout essayé pour arrêter une minuterie, mais la minuterie ne s'arrête pas. Je travaille sur un jeu et j'apprécierais que quelqu'un me dise comment arrêter un chronomètre.
Si vous utilisez System.Timers.Timer
, vous pouvez vous arrêter comme ceci
timer.Enabled = false
si vous utilisez System.Threading.Timer
, utilisez ceci
timer.Change(Timeout.Infinite , Timeout.Infinite)
Ou utiliser
timer.Stop();
si vous utilisez System.Windows.Forms.Timer
Donc, pour ajouter aux réponses précédentes, si vous utilisez la classe System.Threading.Timer, .__, cela l'arrêtera définitivement sans possibilité d'utiliser la même instance:
timer.Dispose()
autrement:
timer.Change(Timeout.Infinite, Timeout.Infinite)
System.Windows.Forms.Timer: timer.Enabled = false;
System.Threading.Timer: timer.Change(Timeout.Infinite, Timeout.Infinite);
System.Timers.Timer: timer.Enabled = false;
ou timer.Stop();
Avec chacun des minuteurs du .NET Framework, il est possible que le minuteur se déclenche juste avant de l'arrêter. Vous verrez le rappel une fois que vous l'avez arrêté.
Vous devrez utiliser quelque chose comme un contexte de rappel asynchrone : utilisez une variable bool
définie sur true
lorsque vous souhaitez que le temporisateur s'exécute et définissez-la sur false
lorsque vous l'arrêtez. Ensuite, demandez à votre callback de vérifier votre contexte pour voir s'il doit réellement fonctionner ou non.
En supposant que vous utilisiez System.Windows.Forms.Timer; puisqu'il n'y avait aucune référence explicite à autre chose ... si c'est le cas ...
System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Stop();
Dépend de la minuterie. S'il s'agit d'un espace de noms de thread, supprimez-le et recréez-le lorsque vous en avez besoin, ou demandez à votre minuterie de déléguer l'attente d'un événement de réinitialisation (voir msdn ). L'espace de noms System.Timers a une méthode de démarrage et d'arrêt.
J'ai aussi rencontré le même problème plusieurs fois.
//Timer init.
var _timer = new System.Timers.Timer
{
AutoReset = true,
Enabled = true,
Interval = TimeSpan.FromSeconds(15).TotalMilliseconds //15 seconds interval
};
_timer.Elapsed += DoSomethingOnTimerElapsed;
//To be called on timer elapsed.
private void DoSomethingOnTimerElapsed(object source, ElapsedEventArgs e)
{
//Disable timer.
_timer.Enabled = false; //or _timer.Stop()
try
{
//does long running process
}
catch (Exception ex)
{
}
finally
{
if (_shouldEnableTimer) //set its default value to true.
_timer.Enabled = true; //or _timer.Start()
}
}
//somewhere in the code if you want to stop timer:
_timer.Enabled = _shouldEnableTimer = false;
//At any point, if you want to resume timer add this:
_timer.Enabled = _shouldEnableTimer = true;
Pourquoi le faire
Supposons que le code dans le bloc try prenne plus de temps. Ainsi, au moment où vous désactivez le minuteur (_timer.Enabled = false or _timer.Stop()
), il est fort probable que le code try à l'intérieur du bloc try soit toujours en cours d'exécution. Par conséquent, une fois que la tâche est terminée, elle est à nouveau activée s'il n'y a pas de contrôle d'indicateur (_shouldEnableTimer
). Par conséquent, j'empêche votre problème en ajoutant une vérification d'indicateur supplémentaire.
Pour plus de clarté, veuillez parcourir le code et les commentaires ajoutés. J'espère que cela t'aides.