2010-08-16 5 views
1

J'écris une application qui utilise une minuterie pour afficher un compte à rebours à l'écran quand un événement se produit. Je veux réutiliser le minuteur, car il serait pratique pour quelques choses dans l'application, donc je précise les mots que je veux entourer le minuteur. Par exemple, l'appel de fonction suivante:Comment exécuter une minuterie synchrone en C#?

CountdownTimer(90, "You have ", " until the computer reboots"); 

montrerait:

You have 1 minute 30 seconds until the computer reboots 

puis décompter.

J'utilise le code suivant:

private void CountdownTimer(int Duration, string Prefix, string Suffix) 
    { 
     Countdown = new DispatcherTimer(); 
     Countdown.Tick += new EventHandler(Countdown_Tick); 
     Countdown.Interval = new TimeSpan(0, 0, 1); 

     CountdownTime = Duration; 
     CountdownPrefix = Prefix; 
     CountdownSuffix = Suffix; 
     Countdown.Start(); 
    } 

    private void Countdown_Tick(object sender, EventArgs e) 
    { 
     CountdownTime--; 
     if (CountdownTime > 0) 
     { 
      int seconds = CountdownTime % 60; 
      int minutes = CountdownTime/60; 

      Timer.Content = CountdownPrefix; 

      if (minutes != 0) 
      { 
       Timer.Content = Timer.Content + minutes.ToString() + @" minute"; 
       if (minutes != 1) { Timer.Content = Timer.Content + @"s"; } 
       Timer.Content = Timer.Content + " "; 
      } 

      if (seconds != 0) 
      { 
       Timer.Content = Timer.Content + seconds.ToString() + @" second"; 
       if (seconds != 1) { Timer.Content = Timer.Content + @"s"; } 
      } 

      Timer.Content = Timer.Content + CountdownSuffix; 

     } 
     else 
     { 
      Countdown.Stop(); 
     } 

    } 

Comment puis-je faire cette course de manière synchrone? Par exemple, je voudrais la suite d'attendre 90 secondes puis redémarrer:

CountdownTimer(90, "You have ", " until the computer reboots"); 
ExitWindowsEx(2,0) 

considérant qu'il appelle le redémarrage immédiatement à l'heure actuelle.

Tous les pointeurs seraient les bienvenus!

Merci,

Ben

Répondre

4

Personnellement, je vous recommande d'avoir un rappel se produire à la fin de votre CountdownTimer - peut-être prendre un Action comme argument, tel que lorsqu'il a terminé ce serait appelé .

private Action onCompleted; 
private void CountdownTimer(int Duration, string Prefix, string Suffix, Action callback) 
{ 
    Countdown = new DispatcherTimer(); 
    Countdown.Tick += new EventHandler(Countdown_Tick); 
    Countdown.Interval = new TimeSpan(0, 0, 1); 

    CountdownTime = Duration; 
    CountdownPrefix = Prefix; 
    CountdownSuffix = Suffix; 
    Countdown.Start(); 

    this.onCompleted = callback; 
} 
... 
    else 
    { 
     Countdown.Stop(); 
     Action temp = this.onCompleted; // thread-safe test for null delegates 
     if (temp != null) 
     { 
      temp(); 
     } 
    } 

alors vous pouvez changer votre utilisation à:

CountdownTimer(90, "You have ", " until the computer reboots", 
    () => ExitWindowsEx(2,0)); 
+0

J'aime cette réponse +1 –

2

Vous pouvez utiliser un AutoResetEvent:

System.Threading.AutoResetEvent _countdownFinishedEvent 
    = new AutoResetEvent(false); 

Ajouter ceci à la fin de CountdownTimer:

_countdownFinishedEvent.WaitOne(); 

Et ajoutez thi s à l'intérieur du reste de Countdown_Tick juste après Countdown.Stop():

_countdownFinishedEvent.Set(); 
Questions connexes