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 для перекраски экрана. При выполнении кода процедура обработки сообщений не выполняется.

таким образом, вы можете сделать следующее, чтобы включить выполнение обработчика сообщений:

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


В настоящее время вся обработка выполняется в основном потоке (UI), поэтому вся обработка должна завершиться до того, как поток UI будет иметь свободные циклы для перекраски пользовательского интерфейса.

у вас есть 2 способа преодолеть это. Первый способ, который не рекомендуется использовать
Application.DoEvents(); запустите это, когда вы хотите, чтобы очередь сообщений Windows обрабатывалась.

другой, рекомендуемый способ: создайте другой поток для обработки и используйте делегат для передачи пользовательского интерфейса обновление обратно в поток пользовательского интерфейса. Если вы новичок в многопоточном развитии, то дайте BackgroundWorker попробовать.


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

У вас есть несколько вариантов здесь:

  • переместить обработку в другой поток и face Invoke () situtations
  • вызовите DoEvents () и позвольте gui обновляться между вашими вызовами DoWork
  • сделать всю работу и обновить позже