2013-12-22 4 views
0

Я хотел сделать индикатор выполнения в моей форме, но когда я запустил его, индикатор прогресса застрял и не движется до конца, он останавливается даже на полпути.Прогресс бар застрял C#

Любое решение?

спасибо.

Вот код:

private void WelcomeScreen_Load(object sender, EventArgs e) 
     { 
      progressBar1.Minimum = 0; 
      progressBar1.Maximum = 100; 
      progressBar1.Step = 5; 
      progressBar1.PerformStep(); 
     } 
+1

Вам необходимо запустить PerformStep() в фоновом потоке. –

+0

Приведенный выше код работает, но он выполняет только один шаг, поэтому увеличивается 5 с допустимого диапазона 0-100. Но он действительно движется, что такое точное поведение, попытайтесь описать его как можно лучше. Редактировать: @Garry Vass, почему бы ему не изменить значение индикатора выполнения из текущего потока? –

ответ

0

Он застрял, как вы не изменяя его значение. Для того, чтобы это было изменено, это значение.

+0

Он выполняет шаг, который ранее определялся как 5, поэтому код эквивалентен: progressBar.Value + = 5; –

+0

Это едва ли ответ. По крайней мере, укажите, что не так и как его решить. Как и сейчас, было бы лучше, как комментарий – psubsee2003

1

Индикатор выполнения застревает, потому что вы только вызываете PerformStep один раз. Когда вы вызываете PerformStep, значение индикатора выполнения увеличивается на 5 (поскольку вы устанавливаете значение 5).

Чтобы индикатор прогресса перемещался больше, вам нужно чаще звонить PerformStep.

Например, если у вас есть рабочий рабочий поток, который работает в фоновом режиме, вы хотите, чтобы пользователь получал уведомление о том, сколько времени займет работа. Вы можете позвонить PerformStep каждый раз, когда вы чувствуете, что хотите показать, что прогресс был достигнут.

Пример кода:

... 
progressBar1.Step = 5; 

InitTheWork(); 

progressBar1.PerformStep(); //This increments the pb's value by 5, since property `Step` has been set to 5 

DoSomeHeavyWork(); 

progressBar1.Value += 20; //This increments pb's value by 20 

FinalizeWork(); 

progressBar1.Value = 100; //This fully fills up the progress bar, to signify that the work has been completed. 
0

Индикатор прогресса не будет "двигаться" само по себе. Вы должны вызывать PerformStep() каждый раз, когда вы хотите его изменить. В текущем коде вызовите функцию PerformStep() 20 раз, чтобы она была завершена. Вы должны сами выяснить, в каких точках ресурсоемкого процесса разумно обновить панель прогресса. Это может выглядеть примерно так:

PerformTask1(); 
progressBar1.PerformStep(); 
PerformTask2(); 
progressBar1.PerformStep(); 
PerformTask3(); 
progressBar1.PerformStep(); 
... 

Вы, вероятно, хотите, чтобы делать все, что занимает много времени, и требуя, чтобы показать, что прогрессбар в другом потоке, чем тот, который вызывает Welcome_Screen_Load, если это тот же самый поток, который обработки пользовательского ввода и обновления графического интерфейса пользователя, чтобы ваш экран загрузки не выглядел невосприимчивым.

Смежные вопросы