2013-03-24 14 views
16

Ho provato a utilizzare il codice seguente per effettuare un ritardo di 2 secondi prima di passare alla finestra successiva. Ma il thread sta invocando per primo e il blocco di testo viene visualizzato per un microsecondo ed è atterrato nella pagina successiva. Ho sentito che un supervisore lo farebbe.Come mettere il ritardo prima di eseguire un'operazione in WPF

Ecco il mio frammento:

tbkLabel.Text = "two mins delay"; 
Thread.Sleep(2000); 
Page2 _page2 = new Page2(); 
_page2.Show(); 
+0

Perché "due ** minuti ** ritardo?" –

risposta

56

La chiamata alla Thread.Sleep blocca il thread dell'interfaccia utente. Devi aspettare in modo asincrono.

Metodo 1: utilizzare un DispatcherTimer

tbkLabel.Text = "two seconds delay"; 

var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) }; 
timer.Start(); 
timer.Tick += (sender, args) => 
    { 
     timer.Stop(); 
     var page = new Page2(); 
     page.Show(); 
    }; 

Metodo 2: utilizzare Task.Delay

tbkLabel.Text = "two seconds delay"; 

Task.Delay(2000).ContinueWith(_ => 
    { 
    var page = new Page2(); 
    page.Show(); 
    } 
); 

Metodo 3: Il modo NET 4.5, uso asincrona/attendere

// we need to add the async keyword to the method signature 
public async void TheEnclosingMethod() 
{ 
    tbkLabel.Text = "two seconds delay"; 

    await Task.Delay(2000); 
    var page = new Page2(); 
    page.Show(); 
} 
+0

Il metodo 1 potrebbe mostrare la nuova pagina più volte nel caso in cui il timer esegua il tick più volte e l'app gestisca troppo lentamente la prima. – usr

+3

@usr In realtà non lo farà. Internamente il timer è un singolo colpo e viene riavviato dopo aver sollevato l'evento Tick. – Phil

+0

chi lo sapeva ?! Non l'ho fatto +1 – usr