Как поставить задержку перед выполнением операции в WPF
Я попытался использовать приведенный ниже код, чтобы сделать 2-секундную задержку перед переходом к следующему окну. Но поток вызывается первым, и текстовый блок отображается на микросекунду и попадает на следующую страницу. Я слышал, диспетчер сделает это.
Вот мой фрагмент:
tbkLabel.Text = "two mins delay";
Thread.Sleep(2000);
Page2 _page2 = new Page2();
_page2.Show();
2 ответа
Решение
Вызов Thread.Sleep блокирует поток пользовательского интерфейса. Вам нужно ждать асинхронно.
Способ 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, используйте 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();
}
Способ 4: .NET 5.0+
Task.WaitAll(new Task[] { Task.Delay(2000) });
У этого решения нет недостатков. Его можно использовать в циклах, что невозможно для "DispatcherTimer" и "ContinueWith".