bamshad1986 Ответов: 3

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


Привет

Я новичок в C#.

Я хочу сделать базовое приложение, которое показывает два сообщения в разных текстовых полях, нажав одну кнопку. Второе сообщение, скорее всего, появится через две секунды.

Я попробовал следующий код, который не работает. Действительно, оба сообщения показываются сразу через две секунды.

Что я уже пробовал:

private void btn_play_Click(object sender, RoutedEventArgs e)
        {
                tb_hello.Text = "hello";
                Thread.Sleep(2000);
                tb_goodbye.Text = "goodbye";
        }

3 Ответов

Рейтинг:
2

Gerry Schmitz

Используйте один или несколько DispatcherTimers для обновления независимых элементов управления, особенно в WPF.

Поскольку они работают "в потоке пользовательского интерфейса", они идеально подходят для обновления элементов управления.

DispatcherTimer - полный учебник WPF[^]


Рейтинг:
1

George Swan

Я бы использовал Асинхронный шаблон на основе задач. await Task.Delay(2000) это асинхронное "ожидание", которое не блокирует поток пользовательского интерфейса. Обратите внимание на async ключевое слово в сигнатуре метода.


private async void btn_play_Click(object sender, RoutedEventArgs e)
       {
           tb_hello.Text = "hello";
           await Task.Delay(2000);
           tb_goodbye.Text = "goodbye";
       }


Рейтинг:
1

OriginalGriff

Нить.Сон приостанавливает текущую нить - это означает, что ничего не происходит до тех пор, пока период не истечет. И это включает в себя обновления для отображения элементов управления! Поскольку вы обновляете элементы управления пользовательского интерфейса, этот код выполняется в потоке пользовательского интерфейса (или вы получите исключение перекрестной потоковой передачи), Что означает, что запросы Paint на обновление фактического отображения не могут быть выполнены до тех пор, пока поток не завершит спящий режим и обработчик событий не завершится.

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


bamshad1986

Мне нужно, чтобы оба сообщения были показаны на последнем экране. Я проверил цикл while с часами времени, но он не работал.

OriginalGriff

Поэтому не заменяйте его - используйте второй элемент управления, как показано в вашем примере. Просто переместите этот бит в обработчик событий таймера и выполните его после периода ожидания.

OriginalGriff

Вы должны помнить, как работает Windows: события Paint имеют очень низкий приоритет (на самом деле сообщения WM_PAINT имеют низкий приоритет, но они генерируют события Paint) и никогда не выполняются во время выполнения кода другими обработчиками событий.

Вы должны использовать таймер, чтобы ваш код был завершен, а затем установить новый текст в коде таймера.