2010-09-16 3 views
4

J'ai une application console et dans la principale méthode, je code comme ceci:Comment arrêter une minuterie après qu'elle a fini de tourner?

Timer time = new Timer(seconds * 1000); //to milliseconds 
time.Enabled = true; 
time.Elapsed += new ElapsedEventHandler(time_Elapsed); 

Je veux que la minuterie pour exécuter une fois si mon idée est que je devrais arrêter le chronomètre dans la méthode TIME_ELAPSED. Cependant, comme mon timer existe dans Main(), je ne peux pas y accéder.

+0

System.Timers.Timer plutôt ou System.Windows.Forms.Timer? Veuillez préciser parce que je suis venu ici pour la même question mais la réponse est pour une minuterie différente et ne sert à rien. – PandaWood

Répondre

21

Vous avez accès à la minuterie à l'intérieur de la méthode timer_Elapsed:

public void timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    Timer timer = (Timer)sender; // Get the timer that fired the event 
    timer.Stop(); // Stop the timer that fired the event 
} 

La méthode ci-dessus arrêtera tout minuteur déclenché l'événement (au cas où vous avez plusieurs temporisateurs utilisant le même gestionnaire et vous voulez que chaque temporisateur ait le même comportement).

Vous pouvez également définir le comportement lorsque vous instancier la minuterie:

var timer = new Timer(); 
timer.AutoReset = false; // Don't reset the timer after the first fire 
+1

C'est ce que je voulais faire et vous avez répondu correctement en premier, donc un gros chèque! – Yom

3

Un petit exemple app:

static void Main(string[] args) 
    { 
     int seconds = 2; 
     Timer time = new Timer(seconds * 1000); //to milliseconds 
     time.Enabled = true; 
     time.Elapsed += new ElapsedEventHandler(MyHandler); 

     time.Start(); 

     Console.ReadKey(); 
    } 

    private static void MyHandler(object e, ElapsedEventArgs args) 
    { 
     var timer = (Timer) e; 
     timer.Stop(); 
    } 
2

Je suppose que vous utilisez System.Timers.Timer plutôt que System.Windows.Forms.Timer?

Vous avez deux options. Tout d'abord, comme probablement le meilleur, est de définir la propriété AutoReset sur false. Cela devrait faire exactement ce que vous voulez.

time.AutoReset = false; 

L'autre option consiste à appeler Stop dans le gestionnaire d'événements.

1

Vous pouvez également utiliser le System.Threading.Timer. Son constructeur prend deux paramètres liés au temps:

  • Le délai avant le premier « tick » (temps voulu)
  • La période

Définissez la période de Timeout.Infinite pour empêcher de tirer à nouveau .

+0

Comment le définir à Timeout.Infinite est probablement une question raisonnable - ce n'est pas évident – PandaWood

Questions connexes