83 votes

C# - comment arrêter un timer ?

Je sais que cela semble stupide, mais j'ai tout essayé pour arrêter un minuteur, mais le minuteur ne s'arrête pas. Je travaille sur un jeu et j'apprécierais si quelqu'un pouvait me dire comment arrêter un minuteur.

10 votes

Postez votre code pour un bon départ.

3 votes

Laquelle des classes de minuteurs ? Il y en a 4 à ma connaissance, juste dans la BCL.

0 votes

En plus, essayez au moins de nous dire ce que vous avez fait pour l'arrêter. "Lire la documentation" est sinon la seule réponse valable.

1voto

Kell Points 1540

Cela dépend de la minuterie. S'il fait partie de l'espace de nom du threading, il faut s'en débarrasser et le recréer quand vous en avez besoin, ou faire en sorte que le délégué du timer attende l'événement de réinitialisation (cf. msdn ). L'espace de nom System.Timers possède une méthode de démarrage et d'arrêt.

1voto

Avi-B Points 667

J'ai également rencontré le même problème à plusieurs reprises.

//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 à l'intérieur du bloc try prenne plus de temps. Donc, au moment où vous désactivez le timer ( _timer.Enabled = false or _timer.Stop() ), il y a de fortes chances que le code à l'intérieur du bloc try soit toujours en cours d'exécution. Par conséquent, après l'achèvement de la tâche, lorsqu'elle arrive à finally, elle est à nouveau activée s'il n'y a pas de flag( _shouldEnableTimer ) vérifier. Par conséquent, j'évite votre problème en ajoutant une vérification supplémentaire du drapeau.

Pour plus de clarté, veuillez consulter le code et les commentaires ajoutés. J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X