С#: подождите, пока индикатор выполнения не закончит рисовать

Возможный дубликат:
Панель выполнения Winforms не работает Обновление (C#)

Первый раз задаю вопрос здесь для меня.

Я попытаюсь объяснить свою проблему, используя этот фрагмент кода:

progressBar1.Maximum = 50;
for (int i = 0; i < 50; i++)
{
    progressBar1.Value++;
}
MessageBox.Show("Finished");
progressBar1.Value = 0;

Проблема с этим кодом заключается в том, что MessageBox появляется во время завершения цикла for, а не, когда индикатор выполнения завершает рисование. Есть ли способ подождать, пока индикатор выполнения не закончит рисовать, прежде чем продолжить?

Спасибо, парни!


person janw    schedule 23.08.2011    source источник
comment
@janw добавляет мой код к моему ответу   -  person sealz    schedule 23.08.2011


Ответы (3)


Вы можете взглянуть на System.Windows.Forms.Application.DoEvents(). Справочник

progressBar1.Maximum = 50;
for (int i = 0; i < 50; i++)
{
    progressBar1.Value++;
    Application.DoEvents();
}
MessageBox.Show("Finished");
progressBar1.Value = 0;
person fjdumont    schedule 23.08.2011
comment
Кажется, это лучший способ сделать это, но я не могу заставить его работать. Вроде немного не помогает, бар все равно лагает. Но я просто скопировал и вставил код. Так что, возможно, я не совсем понимаю ^^. Чтение System.Windows.Forms.Application.DoEvents() мне тоже не помогло :D - person janw; 23.08.2011
comment
У меня лагает? Или вы не видите прогресса? При максимальном значении 50 на моей машине это занимает 8 мс, так что это определенно не прогресс, который может отставать. - person fjdumont; 23.08.2011
comment
Ну, MessageBox открывается еще до того, как панель прогресса начинает рисовать (я знаю, что это не так, но так оно и выглядит). - person janw; 23.08.2011
comment
Увеличьте максимальное значение для справки и проверьте еще раз, пожалуйста. Это не имеет смысла для меня. - person fjdumont; 23.08.2011
comment
Увеличил как progressBar1.Maximum, так и циклы for до 100000. Теперь я вижу улучшение. MessageBox теперь появляется прибл. 60% завершение прогрессбара. - person janw; 23.08.2011
comment
Но это касается как с Application.DoEvents();, так и без него. Это просто вызвано более высокими значениями... - person janw; 23.08.2011
comment
DoEvents — это зло, постарайтесь его не использовать. Вы создадите себе много проблем с повторным входом. - person Jack Bolding; 23.08.2011
comment
Правильный! Хотя, я не вижу точки повторного входа в данную тему. - person fjdumont; 23.08.2011
comment
@fjdumont - могли бы вы увидеть точку повторного входа, если бы указанный код был в обработчике нажатия кнопки? Добавление DoEvents позволит нажимать кнопку во время выполнения цикла... - person Jack Bolding; 23.08.2011

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

progressBar1.Maximum = 50;
for (int i = 0; i < 50; i++) 
{
     progressBar1.Value++; 
     progressBar1.Update();
} 
MessageBox.Show("Finished"); 
progressBar1.Value = 0; 

Другие методы, которые могут работать, заключаются в использовании фонового потока (со всеми дополнительными вызовами Control.Invoke, необходимыми для обратной синхронизации с потоком пользовательского интерфейса). DoEvents (как упоминалось ранее) также должны работать - DoEvents позволит вашему окну снова обрабатывать сообщения в течение времени, которое может пропустить ваши сообщения рисования. Однако он будет прокачивать все сообщения в очереди сообщений, поэтому это может вызвать нежелательные побочные эффекты.

person Jack Bolding    schedule 23.08.2011

Попробуйте следующий код

progressBar1.Maximum = 50;
for (int i = 0; i < 50; i++)
{
   this.SuspendLayout();
   progressBar1.Value++;
   this.ResumeLayout();
}
MessageBox.Show("Finished");

progressBar1.Value = 0;
person Subash    schedule 23.08.2011
comment
Хм. Не работает... Все та же проблема. - person janw; 23.08.2011
comment
При этом вы не увидите постепенное обновление прогресса. - person RvdK; 23.08.2011