2012-07-03 12 views
8

Zasadniczo, gdy stosujemy pewien interwał, tj. 5 sekund, musimy na to poczekać.DispatcherTimer stosuje interwał i wykonuje natychmiast

Czy można natychmiast zastosować interwał i wykonać timer i nie czekać 5 sekund? (Mam na myśli czas przerwy).

Jakaś wskazówka?

Dzięki!

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

Jeśli chcesz, aby coś od razu nastąpiło, dlaczego nie po prostu wykonać go natychmiast? – dlev

+1

@dlev Prawo Ale chcę zobaczyć bardziej elegancki sposób ... –

+0

Nie widzę, co jest nieeleganckie w wywołaniu metody bezpośrednio. Prawdopodobnie powinieneś stworzyć nową metodę, która jest wywoływana w obu miejscach, ale pomysł jest taki sam: jeśli chcesz, aby coś teraz się wydarzyło, to po prostu to zrób! – dlev

Odpowiedz

7

Początkowo ustaw interwał na zero, a następnie zwiększ go podczas kolejnego połączenia.

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

Rozwiązanie Jin jest czystsze. –

13

Są zdecydowanie bardziej eleganckie rozwiązania, ale naiwną metodą jest wywołanie metody timer_Tick po ustawieniu początkowo interwału. To byłoby lepsze niż ustawienie odstępu na każdym tiku.

2

mógł spróbować tego:

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 
} 

Innym sposobem może być użycie dwóch obsługi zdarzeń (w celu uniknięcia kontroli „if” na każdym kleszcza):

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 
} 

Jednak przejrzysty sposób jest co został już zasugerowany:

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

//... 

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

public void SomeAction(){ 
    //... 
} 
Powiązane problemy