Техническая причина для этого заключается в том, что пользовательский интерфейс работает с Message Pumps (в случае WinForms или аналогичным в отношении WPF).По сути, насос сообщений - это очередь рабочих элементов, которую необходимо выполнить, и цикл while, подобный следующему
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
. Что происходит, когда вы обрабатываете свой щелчок
- Клик попадает в очередь сообщений
- Получает обработанный насос сообщений
- Идет в ваш метод клика
- Блокирует поток на х секунд, он все еще в вашем методеи насос не может обработать.
Почему?
Thread.Sleep ()
Приостановляет текущую нить в течение указанного периода времени.
Короче говоря, другие сообщения не обрабатываются.В вашем примере вы засыпаете нить, пока насос еще не успел обработать ваше изменение цвета (он продолжает обрабатывать ваш щелчок).
Когда сообщения в конечном итоге обрабатываются, оно проходит через отставание (ваш цвет меняетсячасть этого), а затем без паузы быстро меняет его с одного на другое.
Исправление довольно простое, вам нужно разрешить насосу обрабатывать сообщения, пока вы ожидаете, и как другие ответы ускользнули,в современной версии .net мы можем использовать шаблон async
await
и использовать метод Task.Delay()
.
Когда программа обрабатывает все, что имеет префикс await
,
- Если вы находитесь в потоке пользовательского интерфейса, он захватывает контекст
- Запуск другого потока с продолжением,
- позволяет обработчику сообщений продолжить обработку.
- Когда задача завершена (и ваша задержка закончена), она возвращает управление обратно в исходный контекст (поток, из которого вы его вызвали).
Привет, presto.Все как и должно быть