Поток BackgroundWorker: обновление пользовательского интерфейса и прерывание операции - PullRequest
5 голосов
/ 12 ноября 2008

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

Возможно ли:

a) Обновите пользовательский интерфейс во время выполнения этой отдельной строки кода или, по крайней мере, отобразите анимированный значок, который показывает пользователю, что работа выполняется.

b) Разрешить пользователю отменять фоновый рабочий поток во время выполнения этой отдельной строки кода

Ответы [ 5 ]

2 голосов
/ 12 ноября 2008

К сожалению, вероятно, нет. Фоновый рабочий поток должен вызывать ReportProgress, чтобы обновить поток пользовательского интерфейса, и ему необходимо отслеживать CancellationPending, чтобы узнать, должен ли он остановиться или нет. Таким образом, если ваш рабочий поток выполняет параллельную операцию в одной строке, это невозможно сделать.

Возможно, я неправильно понял, поэтому вот код, который имитирует то, что я получаю:

public void DoWork() {
    System.Threading.Thread.Sleep(10000);

    // won't execute until the sleep is over
    bgWorker.ReportProgress(100);
}
1 голос
/ 18 февраля 2011

Вы можете обновить UI (или свойства класса) в ReportProgress () метод

Итак, если, как вы заявляете, ваша длительная операция является надежной и не отвечает, как бы вы хотели рассчитать ее прогресс? Это очевидно невозможно.
Разделите вашу операцию на как можно больше фрагментов и вызывайте ReportProgress () после каждого фрагмента.

1 голос
/ 12 ноября 2008

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

1 голос
/ 12 ноября 2008

а) Вы можете отобразить анимированный GIF на форме вместо индикатора выполнения, используя элемент управления PictureBox . Вы можете найти подробную информацию о том, как это сделать, в этом блоге .

b) Класс BackgroundWorker имеет метод CancelAsync , который отправит запрос на отмену текущей операции.
Это установит CancellationPending свойство BackgroundWorker для «True». В обработчике событий DoWork вам придется регулярно опрашивать это свойство, чтобы предпринимать соответствующие действия при изменении его значения.
Также обратите внимание, что для этого вам нужно установить для свойства WorkerSupportsCancellation в BackgroundWorker значение «True».

0 голосов
/ 12 ноября 2008

Вы не поняли неправильно - использование ReportProgress или использование делегата (как я) достигают, по сути, той же цели.

...