2013-03-24 160 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

相关问题