2012-07-03 29 views
8

Básicamente cuando aplicamos algún intervalo, es decir, 5 segundos, tenemos que esperarlo.DispatcherTimer aplicar intervalo y ejecutar inmediatamente

¿Es posible aplicar el intervalo y ejecutar el temporizador inmediatamente y no esperar 5 segundos? (me refiero al tiempo de intervalo).

¿Alguna pista?

Gracias!

public partial class MainWindow : Window 
    { 
     DispatcherTimer timer = new DispatcherTimer(); 

     public MainWindow() 
     { 
      InitializeComponent(); 

      timer.Tick += new EventHandler(timer_Tick); 
      this.Loaded += new RoutedEventHandler(MainWindow_Loaded); 
     } 

     void timer_Tick(object sender, EventArgs e) 
     { 
      MessageBox.Show("!!!"); 
     } 

     void MainWindow_Loaded(object sender, RoutedEventArgs e) 
     { 
      timer.Interval = new TimeSpan(0, 0, 5); 
      timer.Start(); 
     } 
    } 
+2

Si desea que ocurra algo inmediatamente, ¿por qué no ejecutarlo inmediatamente? – dlev

+1

@dlev Right Pero quiero ver una forma más elegante ... –

+0

No veo lo poco elegante que es llamar directamente a un método. Probablemente deberías crear un nuevo método, que se llama en ambos lugares, pero la idea es la misma: si quieres que ocurra algo ahora, ¡hazlo! – dlev

Respuesta

7

Configure inicialmente el intervalo en cero y luego suéltelo en una llamada posterior.

void timer_Tick(object sender, EventArgs e) 
{ 
    ((Timer)sender).Interval = new TimeSpan(0, 0, 5); 
    MessageBox.Show("!!!"); 
} 
+0

La solución de Jin es más limpia. –

13

Definitivamente hay soluciones más elegantes, pero una forma estrafalaria es simplemente llamar al método timer_Tick después de establecer el intervalo inicialmente. Eso sería mejor que establecer el intervalo en cada tic.

2

podría intentar esto:

timer.Tick += Timer_Tick; 
timer.Interval = 0; 
timer.Start(); 

//... 

public void Timer_Tick(object sender, EventArgs e) 
{ 
    if (timer.Interval == 0) { 
    timer.Stop(); 
    timer.Interval = SOME_INTERVAL; 
    timer.Start(); 
    return; 
    } 

    //your timer action code here 
} 

Otra forma podría ser el uso de dos controladores de eventos (para evitar la comprobación de un "si" a cada tick):

timer.Tick += Timer_TickInit; 
timer.Interval = 0; 
timer.Start(); 

//... 

public void Timer_TickInit(object sender, EventArgs e) 
{ 
    timer.Stop(); 
    timer.Interval = SOME_INTERVAL; 
    timer.Tick += Timer_Tick(); 
    timer.Start(); 
} 

public void Timer_Tick(object sender, EventArgs e) 
{ 
    //your timer action code here 
} 

Sin embargo, la forma más limpia es lo ya fue sugerido:

timer.Tick += Timer_Tick; 
timer.Interval = SOME_INTERVAL; 
SomeAction(); 
timer.Start(); 

//... 

public void Timer_Tick(object sender, EventArgs e) 
{ 
    SomeAction(); 
} 

public void SomeAction(){ 
    //... 
} 
Cuestiones relacionadas