Мой WinForm называет класс, который выполняет некоторые действия копирования. Я хотел бы показать прогресс этого на форме.
Я хотел бы использовать Backgroundworker, но я не знаю, как сообщить о прогрессе от класса до формы (/backgroundworker)
используйте метод OnProgressChanged () для BackgroundWorker , чтобы сообщать о прогрессе и подписаться на ProgessChangedEvent BackgroundWorker для обновления прогресс в вашем графическом интерфейсе.
Ваш класс копирования знает BackgroundWorker
и подписывается на ProgressChanged
.Он также предоставляет собственное событие ProgressChanged
, которое вызывается обработчиком событий для события ProgressChanged
фонового исполнителя. Наконец, ваша форма
подписывается на событие ProgressChanged
класса копирования и отображает ход выполнения.
Код:
public class CopySomethingAsync
{
private BackgroundWorker _BackgroundWorker;
public event ProgressChangedEventHandler ProgressChanged;
public CopySomethingAsync()
{
// [...] create background worker, subscribe DoWork and RunWorkerCompleted
_BackgroundWorker.ProgressChanged += HandleProgressChanged;
}
private void HandleProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (ProgressChanged != null)
ProgressChanged.Invoke(this, e);
}
}
Просто подпишитесь в своей форме на событие ProgressChanged
для CopySomethingAsync
и отобразите прогресс.
Все, что вам нужно знать о BackgroundWorker, находится на msdn .
Как сказано в статье:
Чтобы получать уведомления о прогрессе обновления, обработайте событие ProgressChanged.
Обновление:
Прочитав дополнительные вопросы Мартейна и учитывая, что у него есть класс, который до сих пор выполнял свою работу, предположительно в потоке переднего плана, я бы добавил следующее:
Рабочий класс несет ответственность для работы, поэтому он также несет ответственность за отчетность о ее ходе. Тот факт, что он порождает фоновый поток для выполнения работы, не является заботой формы.
Итак, я был бы склонен к тому, чтобы класс настраивал BGW и обрабатывал его события ProgressChanged, а затем генерировал свои собственные события (в потоке переднего плана), на которые сама форма могла бы подписаться. Я много пишу на WinForms, используя эту технику, и она отлично работает.
Альтернативой было бы выставить BGW как общедоступное свойство рабочего класса и заставить форму обрабатывать его события напрямую. Но мне это не очень нравится, так как это делает форму зависимой от реализации рабочего класса. Это вообще плохая вещь.
Это делается через метод экземпляра ReportProgress
вашего текущего объекта BackgroundWorker
. Ваша форма должна подписаться на событие ProgressChanged
.
В MSDN есть небольшой пример: http://msdn.microsoft.com/en-us/library/waw3xexc%28v=VS.100%29.aspx
вызов в своем классе
backgroundWorker.ReportProgress(i++);
на форме обработчик события
//declare progressBar1 in the form and set range
// progressBar1.Minimum = 0;
//progressBar1.Maximum = 100;
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//show progress bar
}