Как установить задержку перед выполнением операции в WPF

#c# #wpf #windows #visual-studio

Вопрос:

Я попытался использовать приведенный ниже код, чтобы сделать 2-секундную задержку перед переходом к следующему окну. Но поток запускается первым, и текстовый блок отображается в течение микросекунды и попадает на следующую страницу. Я слышал, что диспетчер сделал бы это.

Вот мой фрагмент:

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

Комментарии:

1. Почему «задержка на две минуты «?

Ответ №1:

Вызов потока.Сон блокирует поток пользовательского интерфейса. Вам нужно ждать асинхронно.

Способ 1. используйте диспетчер времени

 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: используйте задание.Задержка

 tbkLabel.Text = "two seconds delay";

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

Метод 3: Способ .NET 4.5, используйте асинхронное/ожидание

 // 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. Метод 1 может отображать новую страницу несколько раз, если таймер тикает несколько раз, а приложение слишком медленно обрабатывает первую страницу.

2. @usr На самом деле этого не будет. Внутренне таймер представляет собой один выстрел и перезапускается после поднятия события Тика.

3. Также я обнаружил, что это делает то же самое: tbkLabel. Текст = «две минуты ожидания»; Диспетчер. Вызовите(новое действие (() = > Поток. Сон(2000)),диспетчерское управление. Фон); Страница 2 _page2 = новая страница 2(); _page2.Показать();

4. Просто для справки, Task.Delay() к сожалению, это также метод .NET 4.5.

5. Разве вам не нужно было бы отправить page.show() в способе 2?

Ответ №2:

Способ 4: .NET 5.0

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

У этого решения нет недостатков. Его можно использовать в циклах, которые для «ДиспетчериЗации» и «продолжения» невозможны.