如何在WPF中执行操作之前放置延迟

Bha*_*dur 28 c# wpf dispatcher thread-sleep

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

这是我的片段:

tbkLabel.Text = "two mins delay";
Thread.Sleep(2000);
Page2 _page2 = new Page2();
_page2.Show();
Run Code Online (Sandbox Code Playgroud)

Phi*_*hil 80

对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();
    };
Run Code Online (Sandbox Code Playgroud)

方法2:使用Task.Delay

tbkLabel.Text = "two seconds delay";

Task.Delay(2000).ContinueWith(_ => 
   { 
     var page = new Page2();
     page.Show();
   }
);
Run Code Online (Sandbox Code Playgroud)

方法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();
}
Run Code Online (Sandbox Code Playgroud)

  • 仅仅为了记录,`Task.Delay()`很遗憾也是一个.NET 4.5方法. (11认同)
  • @usr实际上它不会.在内部,计时器是一次性的,并在提升Tick事件后重新启动. (3认同)
  • 我也发现这也是一样的:tbkLabel.Text ="两分钟"; Dispatcher.Invoke(new Action(()=> Thread.Sleep(2000)),DispatcherPriority.Background); Page2 _page2 = new Page2(); _page2.Show(); (2认同)
  • 您不需要在方法 2 中调度 `page.show()` 吗? (2认同)