web-dev-qa-db-fra.com

C # - comment arrêtez-vous une minuterie?

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.

58
di0xide007

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

129
Arsen Mkrtchyan

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)
25
dexter

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(); 

20
EricSchaefer

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.

5
Stephen Cleary

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(); 
1
Aaron McIver

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.

1
Kell

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.

1
Avi-B