41

在导航到下一个窗口之前,我尝试使用以下代码延迟 2 秒。但是线程首先调用,文本块显示一微秒并进入下一页。我听说调度员会这样做。

这是我的片段:

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

2 回答 2

109

对 Thread.Sleep 的调用阻塞了 UI 线程。您需要异步等待。

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

方法二:使用Task.Delay

tbkLabel.Text = "two seconds delay";

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

方法3:.NET 4.5方式,使用async/await

// 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();
}
于 2013-03-24T15:02:35.493 回答
0

方法 4:.NET 5.0+

    Task.WaitAll(new Task[] { Task.Delay(2000) });

该解决方案没有缺点。它可以用于“DispatcherTimer”和“ContinueWith”不可能的循环中。

于 2021-11-12T13:20:02.080 回答