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

Posted

技术标签:

【中文标题】如何在 WPF 中进行操作之前延迟【英文标题】:How to put delay before doing an operation in WPF 【发布时间】:2021-11-04 17:16:09 【问题描述】:

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

这是我的 sn-p:

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

【问题讨论】:

为什么“延迟两 分钟?” 【参考方案1】:

对 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();

【讨论】:

方法1可能会多次显示新页面,以防计时器多次计时并且应用程序处理第一个页面太慢。 @usr 实际上不会。在内部,计时器是单次触发,并在引发 Tick 事件后重新启动。 我也发现这也是一样的:tbkLabel.Text = "two mins delay"; Dispatcher.Invoke(new Action(() => Thread.Sleep(2000)),DispatcherPriority.Background); Page2 _page2 = new Page2(); _page2.Show(); 只是为了记录,Task.Delay() 不幸的是也是一个 .NET 4.5 方法。 你不需要在方法2中发送page.show()吗?【参考方案2】:

方法 4:.NET 5.0+

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

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

【讨论】:

以上是关于如何在 WPF 中进行操作之前延迟的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WPF 中的删除操作之前启用文本框并等待输入条件

如何在WPF中进行模态对话?

如何允许完整的 WPF 故事板动画

Anylogic - 如何在服务器接受另一个实体之前建模延迟

wpf webBrowser 禁用超链接

如何延迟加载?