2010-10-13 3 views
0

Что происходит, когда я нажимаю кнопку, чтобы запустить мой код, моя форма выигрыша блокируется, и мой индикатор выполнения не запускается. Что я делаю не так?C# индикатор выполнения не отображается WinForm

foreach (string barcount in idit) 
{ 
    barcountmax++; 
} 

label2.Text = "Total entries: " + barcountmax; 
progressBar1.Minimum = 0; 
progressBar1.Maximum = barcountmax; 

... 

foreach (string ids in idit) 
{ 
    string[] splitids = ids.Split('|'); 
    string fixcommacrap = ""; 
    barmovement++; 
    progressBar1.Value = barmovement; 
} 

My Winform просто блокирует и зависает, я не могу видеть индикатор выполнения.

ответ

5

Я предполагаю, что вы выполняете всю работу в потоке пользовательского интерфейса. Не делай этого.

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

Если вы ищете BackgroundWorker учебники, вы найдете целую кучу таких, как this one. Многие из них приведут примеры с использованием индикаторов выполнения, поскольку BackgroundWorker в значительной степени предназначен для этого сценария.

+0

http://www.devtoolshed.com/content/c-download-file-progress-bar Ссылка на сайт для примера. ;) – Emerion

+1

@Emerion: Я уже связался с сайтом с примером ... –

+0

@ Jon woops !, вероятно, прочитал ссылку, извините! ;) – Emerion

1

По умолчанию, если вы используете длительную операцию, winform не будет перерисовываться. Чтобы исправить это учитывать:

  1. Запуск ваших вычислений на отдельном потоке, предпочтительно с использованием BackgroudWorker
  2. Перекрашивание это вручную каждый раз, когда вы меняете свой прогресс бар.

(1) настоятельно рекомендуется.

1

Для этого вам необходимо при необходимости оставить краску формы. Правильный/предпочтительный способ - использовать рабочий поток (возможно, BackgroundWorker) для длительных задач, периодически обращаясь к потоку пользовательского интерфейса, чтобы попросить его обновить прогресс.

Существует также DoEvents, но это (откровенно) взломать.

1

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

Application.DoEvents(); 

Более сложным является использование отдельный поток для расчетов и текущий поток UI для обновления индикатор выполнения.

+0

Может иногда работать, но очень плохая практика – smirkingman

+0

Я сказал, что, если вы не заметили. И это не только мой совет. Посмотри вокруг, мужик. Почему вы опускаете мой ответ? –

+1

Разница между «неправильной» и «очень плохой практикой». DoEvents вовсе не является решением, даже если предположить, что это ужасно плохой совет, который, вероятно, приведет к неправильному пути OP. – smirkingman

0

Как и было предложено, используйте BackGroundWorker.

В рабочем месте НЕ обновляйте ProgressBar напрямую, сделайте это с помощью BeginInvoke.

+0

За исключением опечатки (Назад ** g ** roundWorker) - почему это было опущено? – Niki

+0

причина, по которой он ниспроверг мой вопрос –

+2

Пожалуйста, вырастите (и дайте мне более 30 секунд, чтобы ответить на вашу жалобу) – smirkingman

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