Обновление статуса Winform в BackgroundWorker

У меня многоступенчатый процесс BackgroundWorker. Я использую выделенную полосу выполнения, потому что некоторые из этих шагов выполняются на сервере iSeries, поэтому нет хорошего способа определить процентное соотношение. Я представляю себе ярлык с обновлениями после каждого шага. Как бы вы порекомендовали обновить метку на winform, чтобы отразить каждый шаг?

Прикинул, что добавлю еще немного. Я вызываю некоторые программы CL и RPG через хранимую процедуру на iSeries (или IBM i, или AS / 400, или компьютер среднего уровня под управлением OS / 400 ... э ... i5 / OS (черт возьми, IBM, за то, что вы не сохранили одно и то же имя из года в год)).

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

  1. Выгрузка данных в iSeries
  2. Работает в конце месяца
  3. Создание отчетов
  4. Загрузка окончательных результатов

Наверное, я должен был сказать это вначале. Извини за это. Я стараюсь, чтобы мои вопросы были достаточно общими, чтобы другие могли использовать их позже, а не мою конкретную задачу.


person Mike Wills    schedule 16.03.2010    source источник


Ответы (2)


По сути, это одна из сторон фонового работника. Используйте ProgressBar и просто определите, насколько далеко продвинулся прогресс в соответствии с вашим алгоритмом.

(Как уже упоминалось, если они прошли 10%, отправьте 10, если они 50%, отправьте 50)

Использование BackgroundWorker bgWrk

Добавьте следующее событие:

bgWrk.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(bgWrk_ProgressChanged);
// Note: This method is invoked on the UI thread

void bgWrk_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
    // Add progress to whatever UI element needs updating. The below simply uses a progress bar.
    prog.Value = e.ProgressPercentage;
}

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

bgWrk.ReportProgress(intValue);

Пара замечаний:

  • Вы также можете передать Object в методе ReportProgress(), чтобы вы могли обновить метку строковым объектом и т. Д., Однако индикатор выполнения по-прежнему является универсальным символом «подождите, я что-то делаю»

  • Если у вас есть неопределенный опрос и вы используете ProgressBar, попробуйте использовать его как Indeterminate ProgressBar, или счетчик или что-то подобное. WPF имеет встроенное свойство, позволяющее сделать индикатор выполнения неопределенным, что полезно.

person Kyle Rosendo    schedule 16.03.2010
comment
одна вещь, которую вы упустили Rozendo: событие ProgressChanged - этот метод вызывается в потоке пользовательского интерфейса или в фоновом потоке? - person Cheeso; 16.03.2010
comment
Он будет вызываться в потоке пользовательского интерфейса. Он был разработан для использования, в частности, с ProgressBars. Вот почему EventArgs предоставляют процент для доступа к этой функции. - person Kyle Rosendo; 16.03.2010

Сколько там ступеней? Если есть 10 шагов, просто используйте маркер увеличения на 10% в конце каждого шага, который был успешно завершен.

person t0mm13b    schedule 16.03.2010
comment
Шаги в iSeries - это более 50% шагов, которые я не могу передать обратно в C #. Думаю, в любом случае я мог бы просто обновить по проценту. - person Mike Wills; 16.03.2010
comment
ох .... iSeries как в мейнфрейме? или боксы AIX? Я отредактирую этот ответ соответственно ... - person t0mm13b; 16.03.2010
comment
iSeries, как в IBM i, AS / 400 или компьютере среднего уровня. Он работает под управлением OS / 400, а вызываемая логика находится в CL и RPG. Мне нужно вызвать его через хранимую процедуру, и мне нужно дождаться его успешного завершения, прежде чем я смогу перейти к следующему шагу. - person Mike Wills; 16.03.2010
comment
Ааа ... AS / 400 ... Командный язык (CL) и как вы к нему подключаетесь? вы разговариваете с портом TCP / IP ... Сценарий CL отправляет статус обратно на порт TCP / IP? - person t0mm13b; 16.03.2010
comment
Через провайдера IBM ADO.NET. Похоже, это оптимизированное соединение ODBC. - person Mike Wills; 16.03.2010
comment
@Mike: может помочь показать часть сценария CL и его сторону подключения ado.net ... с точки зрения кода ... - person t0mm13b; 16.03.2010