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

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

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

Ответ 1

используйте метод OnProgressChanged() BackgroundWorker сообщить о прогрессе и подписаться на ProgessChangedEvent BackgroundWorker, чтобы обновить прогресс в вашем графическом интерфейсе.

Класс копирования знает BackgroundWorker и подписывается на ProgressChanged. Он также предоставляет собственное событие ProgressChanged, которое возникает обработчиком события для фона ProgressChanged. Наконец, ваш Form подписывается на событие 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 и покажите ход.

Ответ 2

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

Как говорится в статье:

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


Update:

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

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

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

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

Ответ 3

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

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

Ответ 4

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

 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

    }