GUI не обновляется до завершения кода
Эй, у меня есть последовательность кода, которая идет примерно так:
label.Text = "update 0";
doWork();
label.Text = "update 1";
doWork2();
label.Text = "update 2";
в принципе, GUI не обновляется вообще, пока весь код не будет выполнен. Как это преодолеть?
4 ответов
уродливый Хак использовать Application.DoEvents
. Пока это работает, я бы не советовал.
лучшим решением является использование BackgroundWorker
или отдельный поток для выполнения длительных задач. Не используйте поток GUI, потому что это приведет к его блокировке.
важно знать, что изменения в GUI должны быть сделаны в потоке GUI, поэтому вам нужно передать управление обратно в поток GUI для обновления меток. Это делается с помощью Invoke
. Если вы используете BackgroundWorker, вы можете использовать ReportProgress - это автоматически обработает вызов Invoke для вас.
обновления пользовательского интерфейса, когда он получает сообщение WM_PAINT для перекраски экрана. При выполнении кода процедура обработки сообщений не выполняется.
таким образом, вы можете сделать следующее, чтобы включить выполнение обработчика сообщений:
- используйте BackgroundWorker
- вызов
Application.DoEvents()
на приложение.Функция doevents, вызывает обработчик сообщений, а затем возвращает. Не идеально для больших работ, но для небольших процедур это может быть гораздо более простое решение, вместо того, чтобы вводить резьбу.
В настоящее время вся обработка выполняется в основном потоке (UI), поэтому вся обработка должна завершиться до того, как поток UI будет иметь свободные циклы для перекраски пользовательского интерфейса.
у вас есть 2 способа преодолеть это. Первый способ, который не рекомендуется использоватьApplication.DoEvents();
запустите это, когда вы хотите, чтобы очередь сообщений Windows обрабатывалась.
другой, рекомендуемый способ: создайте другой поток для обработки и используйте делегат для передачи пользовательского интерфейса обновление обратно в поток пользовательского интерфейса. Если вы новичок в многопоточном развитии, то дайте BackgroundWorker попробовать.
GUI не может обновляться при запуске вашего кода таким образом. GUI в windows зависит от обработки сообщений, и обработка сообщений приостанавливается, пока вы находитесь в своем коде - независимо от того, что вы делаете с метками, кнопками и т. д., Все они будут обновлены после выхода вашего кода и обработки основного цикла messaage формы.
У вас есть несколько вариантов здесь:
- переместить обработку в другой поток и face Invoke () situtations
- вызовите DoEvents () и позвольте gui обновляться между вашими вызовами DoWork
- сделать всю работу и обновить позже