2010-05-15 14 views
8

Quiero utilizar un temporizador solo una vez, en 1 segundo después de la inicialización de mi formulario principal. Pensé que lo siguiente tendría un cuadro de mensaje que decía "Hola mundo" solo una vez, pero en realidad un nuevo cuadro de mensaje dice "Hola mundo" cada segundo.Usar el temporizador solo una vez

¿Por qué? Había puesto t.Stop() en el evento tick. Además, ¿tengo que eliminar el temporizador de alguna manera para evitar fugas de 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(); 

Por favor ayuda y demuestra si hay una manera mejor de hacer esto? Gracias.

Respuesta

9

Reemplazar MessageBox.Show("Hello World"); t.Stop(); con t.Stop();MessageBox.Show("Hello World");. Como no está presionando OK a tiempo, el temporizador ya ha marcado nuevamente y nunca llegó al código de detención.

+1

+1 por ser beat'd. – Robb

+0

Ok, eso funciona. Gracias. Pero, ¿cuál es la lógica? ¿Por qué es importante el pedido? – zaidwaqi

+0

@zaidwaqi: El hilo va al método MessageBox.Show, y no sale hasta que presione OK. Pero no presiona OK lo suficientemente rápido, y ya ha abierto un nuevo MessageBox. –

2

Deja t.Stop(); antes de la MessageBox.Show("Hellow World");

1

Esto se puede conseguir también con System.Timers.Timer y el establecimiento de AutoReset a falso. Estaba buscando en qué temporizador usar y prefiero este, ya que no requiere el comando de parada por separado.

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(); 
Cuestiones relacionadas