Это стандартное поведение для любого приложения с графическим интерфейсом Windows, обновления экрана не происходят, пока поток пользовательского интерфейса не перейдет в режим ожидания, чтобы Windows могла доставить событие Paint. Одна из самых худших вещей, которые вы можете сделать, это вызвать Application.DoEvents (). Да, это доставит событие Paint. Но это также позволяет вашему пользователю закрыть форму. Это создает Big Kaboom, когда элемент управления, который вы пытаетесь обновить, внезапно исчезает. Ваш цикл все еще работает, но форма больше не существует.
Что вы, должно быть, заметили, так это то, что индикатор выполнения действительно обновился, а CheckedListBox - нет. Это связано с тем, что ProgressBar часто используется для отображения прогресса, когда код находится в цикле, поэтому он гарантирует, что при изменении свойства Value он немедленно раскрашивает себя, не дожидаясь, пока Windows сообщит, что его нужно перекрасить. Грязный трюк, очень запутанный.
Но вы также можете воспользоваться этим трюком, это легко. Измените свой код следующим образом:
for (int i = 0; i < 10; i++)
{
SOME_FUNCTION();
progressBar.Value++;
checkListBoxItems.SetItemCheckState(i, CheckState.Checked);
checkListBoxItems.Update();
}
Метод Update () означает «нарисуйте себя, когда это необходимо». То есть вы изменили состояние проверки элемента. Никогда на вас не действует Big Kaboom, пользователь не может внезапно заставить управление исчезнуть.
Если SOME_FUNCTION () занимает много времени, например, более 10 x 0,3 секунды или около того, вам следует подумать об использовании потоков.