如何在WPF中进行操作前延迟?

47

我尝试使用以下代码在导航到下一个窗口之前进行2秒延迟。但是线程首先被调用,文本块仅显示了一微秒就进入了下一页。我听说可以使用dispatcher解决这个问题。

这是我的代码片段:

tbkLabel.Text = "two mins delay";
Thread.Sleep(2000);
Page2 _page2 = new Page2();
_page2.Show();
2个回答

118

调用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();
   }
);

第三种方法:.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();
}

3
实际上不会。内部计时器是单次触发的,在引发Tick事件后重新启动。 - Phil
2
同时我发现这个也可以实现同样的效果:tbkLabel.Text = "两分钟延迟"; Dispatcher.Invoke(new Action(() => Thread.Sleep(2000)), DispatcherPriority.Background); Page2 _page2 = new Page2(); _page2.Show(); - BharathNadadur
11
只是为了说明,Task.Delay() 是一个不幸的 .NET 4.5 方法。 - acraig5075
你会如何修改第一个方法来添加一个倒计时器,显示距离页面切换剩余的秒数? - lahjaton_j
2
在第二种方法中,你不需要调用 page.show() 吗? - ymbcKxSw
显示剩余4条评论

1
方法四:.NET 5.0+
    Task.WaitAll(new Task[] { Task.Delay(2000) });

这个解决方案没有任何缺点。它可以在循环中使用,而对于“DispatcherTimer”和“ContinueWith”来说是不可能的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接