Вы не можете получить доступ к Windows элементам управления, таким как ProgressBar, из метода DoWork или любого вызванного им метода, поскольку поток, выполняющий этот код, является фоновым потоком, а не тем же потоком, который создал элемент управления. Вы получите исключение, в сообщении которого говорится, что доступ к элементу управления осуществляется потоком, отличным от потока, который его создал, если вы попытаетесь. Это нерушимое правило о windows элементах управления; к ним всегда должен обращаться только поток, создавший их
BackgroundWorker имеет свойство WorkerReportsProgress
, которое должно быть установлено в true, и метод ReportProgress()
, который можно вызывать с помощью int (и передавать необязательный объект для получения дополнительной информации) процент завершения. Когда вы вызываете этот метод в DoWork, BackgroundWorker автоматически вызывает событие ProgressChanged и, что очень важно, делает это, используя поток переднего плана, в котором он был создан (тот же поток, в котором были созданы другие элементы управления), поэтому код внутри обработчика события ProgressChanged имеет вид выполняется с использованием соответствующего потока и может обращаться к элементу управления ProgressBar, не вызывая исключения
В итоге:
- Установите для WorkerReportsProgress значение true
- Вызовите ReportProgress внутри DoWork, передав Процент завершения или использование int для указания того, что процесс достиг какой-то стадии (это не должен быть процент)
- Присоединение обработчика событий к событию ProgressChanged вашего работника
- Перемещение кода ProgressBar в обработчик событий ProgressChanged