C # индикатор выполнения не показывает WinForm - PullRequest
0 голосов
/ 13 октября 2010

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

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;
}

Моя Winform просто блокируется и зависает, я не вижу индикатор выполнения.

Ответы [ 5 ]

5 голосов
/ 13 октября 2010

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

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

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

1 голос
/ 13 октября 2010

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

Application.DoEvents();

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

1 голос
/ 13 октября 2010

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

Есть также DoEvents, но это (честно говоря) взломать.

1 голос
/ 13 октября 2010

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

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

(1).

0 голосов
/ 13 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...