2010-05-15 34 views
8

Desidero utilizzare un timer solo una volta, a 1 secondo dopo l'inizializzazione del mio modulo principale. Ho pensato che quanto segue avrebbe una casella di messaggio che diceva "Hello World" solo una volta, ma in realtà una nuova finestra di messaggio dice "Hello World" ogni secondo.Utilizzo del timer una sola volta

Perché così? Ho inserito t.Stop() nell'evento tick. Inoltre, è necessario smaltire il timer in qualche modo per evitare perdite di memoria?

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

     t.Start(); 

Si prega di aiutare e mostrare se c'è un modo migliore per farlo? Grazie.

risposta

9

Sostituire MessageBox.Show("Hello World"); t.Stop(); con t.Stop();MessageBox.Show("Hello World");. Poiché non stai premendo OK in tempo, il timer è già spuntato di nuovo e non hai mai raggiunto il codice di stop.

+1

+1 per essere battuti. – Robb

+0

Ok, questo funziona. Grazie. Ma qual è la logica? Perché l'ordine è importante? – zaidwaqi

+0

@zaidwaqi: il thread entra nel metodo MessageBox.Show e non esce finché non si preme OK. Ma non si preme OK abbastanza velocemente, e ha già aperto un nuovo MessageBox. –

2

Mettere t.Stop(); prima della MessageBox.Show("Hellow World");

1

È possibile raggiungere questo obiettivo anche con System.Timers.Timer e l'impostazione AutoReset su false. Stavo cercando in quale timer utilizzare e preferisco questo perché non richiede il comando di arresto separato.

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(); 
Problemi correlati