Как сообщить о прогрессе из класса к BackgroundWorker?

Мой WinForm называет класс, который выполняет некоторые действия копирования. Я хотел бы показать прогресс этого на форме.

Я хотел бы использовать Backgroundworker, но я не знаю, как сообщить о прогрессе от класса до формы (/backgroundworker)

12
задан andyp 7 May 2014 в 20:39
поделиться

4 ответа

используйте метод 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 и отобразите прогресс.

14
ответ дан 2 December 2019 в 06:07
поделиться

Все, что вам нужно знать о BackgroundWorker, находится на msdn .

Как сказано в статье:

Чтобы получать уведомления о прогрессе обновления, обработайте событие ProgressChanged.


Обновление:

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

  • Рабочий класс несет ответственность для работы, поэтому он также несет ответственность за отчетность о ее ходе. Тот факт, что он порождает фоновый поток для выполнения работы, не является заботой формы.

  • Итак, я был бы склонен к тому, чтобы класс настраивал BGW и обрабатывал его события ProgressChanged, а затем генерировал свои собственные события (в потоке переднего плана), на которые сама форма могла бы подписаться. Я много пишу на WinForms, используя эту технику, и она отлично работает.

Альтернативой было бы выставить BGW как общедоступное свойство рабочего класса и заставить форму обрабатывать его события напрямую. Но мне это не очень нравится, так как это делает форму зависимой от реализации рабочего класса. Это вообще плохая вещь.

8
ответ дан 2 December 2019 в 06:07
поделиться

Это делается через метод экземпляра ReportProgress вашего текущего объекта BackgroundWorker. Ваша форма должна подписаться на событие ProgressChanged.

В MSDN есть небольшой пример: http://msdn.microsoft.com/en-us/library/waw3xexc%28v=VS.100%29.aspx

2
ответ дан 2 December 2019 в 06:07
поделиться

вызов в своем классе

 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

    }
1
ответ дан 2 December 2019 в 06:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: