2009-09-12 8 views
2

J'ai regardé dans la classe Timer (http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx), mais la chose à propos de la minuterie est, elle est en cours. Y a-t-il un moyen de l'arrêter après une partie? ou après 5 ans?C# Timer Class - Arrêt après un certain nombre d'exécutions

En ce moment, je fais ce qui suit:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Timers; 

namespace TimerTest 
{ 
    class Program 
    { 
     private static System.Timers.Timer aTimer; 
     static void Main(string[] args) 
     { 
      DoTimer(1000, delegate 
      { 
       Console.WriteLine("testing..."); 
       aTimer.Stop(); 
       aTimer.Close(); 
      }); 
      Console.ReadLine(); 
     } 

     public static void DoTimer(double interval, ElapsedEventHandler elapseEvent) 
     { 
      aTimer = new Timer(interval); 
      aTimer.Elapsed += new ElapsedEventHandler(elapseEvent); 
      aTimer.Start(); 
     } 
    } 
} 

Répondre

5

Ce n'est pas comme vous l'avez fait maintenant. L'événement Elapsed est levé une fois et s'arrête parce que vous avez appelé Stop. Quoi qu'il en soit, changez votre code comme suit pour accomplir ce que vous voulez.

private static int iterations = 5; 
static void Main() 
{ 
    DoTimer(1000, iterations, (s, e) => { Console.WriteLine("testing..."); }); 
    Console.ReadLine(); 
} 

static void DoTimer(double interval, int iterations, ElapsedEventHandler handler) 
{ 
    var timer = new System.Timers.Timer(interval); 
    timer.Elapsed += handler; 
    timer.Elapsed += (s, e) => { if (--iterations <= 0) timer.Stop(); }; 
    timer.Start(); 
} 
+0

Brian, juste pour vous informer que j'ai corrigé les erreurs dans le code (jetez un oeil si vous êtes d'accord) –

0

Utilisez System.Threading.Timer et spécifiez un dueTime mais spécifiez une période de Timeout.Infinite.

+0

Bonjour monsieur, j'ai essayé de cette façon. Mais il semble utiliser plus de cpu, plutôt que celui que j'ai maintenant. Je suppose que je vais rester avec ce que j'ai alors? – TheAJ

0
public static void DoTimer(double interval, ElapsedEventHandler elapseEvent) 
{ 
    aTimer = new Timer(interval); 
    aTimer.Elapsed += new ElapsedEventHandler(elapseEvent); 
    aTimer.Elapsed += new ElapsedEventHandler((s, e) => ((Timer)s).Stop()); 
    aTimer.Start(); 
} 
+1

En quoi est-ce différent de ce qu'il a fait en plus du fait que vous avez tiré deux handlers une fois écoulés? – codymanix

+0

Il ne peut plus jamais redémarrer le chronomètre sans l'arrêter après un seul intervalle –

+0

@corps: le 2ème handler arrête le chronomètre, de sorte que l'événement ne se déclenche qu'une fois. C'est exactement ce qu'il a demandé. Pour l'exécuter cinq fois, ajoutez-le en tant que paramètre à DoTimer. L'expression lambda créerait une fermeture afin que cela fonctionne comme prévu. @Yuriy: Il ne pouvait pas encore redémarrer ce minuteur: la variable était locale à la méthode DoTimer. –

4

Pourquoi avez-vous tout simplement pas un compteur qui int initialement commencer à 0 et est incrémenté à chaque fois que le ElapsedEventHandler est tiré? Ensuite, vous ajoutez simplement une vérification dans le gestionnaire d'événements à Stop() le minuteur si le compteur dépasse le nombre d'itérations.

0

En créant objet de la classe donnée, vous pouvez utiliser la minuterie dans toutes les classes

public class timerClass 
    { 


     public timerClass() 
     { 
      System.Timers.Timer aTimer = new System.Timers.Timer(); 
      aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
      // Set the Interval to 5 seconds. 
      aTimer.Interval = 5000; 
      aTimer.Enabled = true; 
     } 

     public static void OnTimedEvent(object source, ElapsedEventArgs e) 
     { 
      Console.Writeln("Welcome to TouchMagix"); 
     } 
} 
Questions connexes