2013-03-24 202 views
16

我試圖使用下面的代碼在導航到下一個窗口之前做出2秒的延遲。但線程首先調用,文本塊顯示一微秒,然後進入下一頁。我聽說調度員會這樣做。如何在WPF中執行操作之前放置延遲

這裏是我的代碼片段:

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

爲什麼「兩分鐘**延遲?」 – 2016-01-05 06:59:04

回答

56

到了Thread.Sleep調用阻塞UI線程。你需要等待異步。

方法1:使用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(); 
    }; 

方法2:使用Task.Delay

tbkLabel.Text = "two seconds delay"; 

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

方法3:該.NET 4.5方式,使用異步/等待

// 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

方法1可能多次顯示新頁面,以防計時器多次觸發,並且應用程序處理第一個應用程序太慢。 – usr 2013-03-24 15:12:48

+3

@usr其實它不會。在內部,定時器是一次性的,並在提高Tick事件後重新啓動。 – Phil 2013-03-24 15:18:36

+0

誰知道?!我沒有。 +1 – usr 2013-03-24 15:20:49

相關問題