2010-05-15 7 views
8

Je souhaite utiliser une minuterie une seule fois, 1 seconde après l'initialisation de mon formulaire principal. Je pensais que ce qui suit aurait une boîte de message disant "Hello World" juste une fois, mais en fait une nouvelle boîte de message dit "Hello World" toutes les secondes.Utilisation de la minuterie une seule fois

Pourquoi cela? J'avais mis t.Stop() dans l'événement tick. De même, dois-je disposer de la minuterie pour éviter les fuites de mémoire?

 Timer t = new Timer(); 
     t.Interval = 1000;     
     t.Tick += delegate(System.Object o, System.EventArgs e) 
         { MessageBox.Show("Hello World"); t.Stop(); }; 

     t.Start(); 

S'il vous plaît aider et montrer s'il ya une meilleure façon de le faire? Merci.

Répondre

9

Remplacer MessageBox.Show("Hello World"); t.Stop(); par t.Stop();MessageBox.Show("Hello World");. Comme vous n'appuyez pas sur OK à temps, la minuterie a déjà coché et vous n'avez jamais atteint le code d'arrêt.

+1

+1 pour être battu. – Robb

+0

Ok, ça marche. Merci. Mais quelle est la logique? Pourquoi la commande est-elle importante? – zaidwaqi

+0

@zaidwaqi: Le thread va dans la méthode MessageBox.Show, et ne part pas tant que vous n'avez pas appuyé sur OK. Mais vous n'appuyez pas assez vite sur OK, et il a déjà ouvert un nouveau MessageBox. –

2

Mettre t.Stop(); avant la MessageBox.Show("Hellow World");

1

Vous pouvez y parvenir aussi avec System.Timers.Timer et la mise en AutoReset à false. Je regardais dans quelle minuterie à utiliser et préférer celui-ci car il ne nécessite pas la commande d'arrêt séparée.

using System; 
using System.IO; 
using System.Timers; 

System.Timers.Timer t = new System.Timers.Timer() { 
    Interval = 1000, 
    AutoReset = false 
}; 

t.Elapsed += delegate(System.Object o, System.Timers.ElapsedEventArgs e) 
    { Console.WriteLine("Hell");}; 
t.Start(); 
Questions connexes