Как сообщить о прогрессе из класса в BackgroundWorker? - PullRequest
12 голосов
/ 20 июля 2010

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

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

Ответы [ 4 ]

14 голосов
/ 20 июля 2010

используйте метод 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);
    }
}

В вашей форме просто подпишитесь на событие ProgressChangedCopySomethingAsync и отображение прогресса.

8 голосов
/ 20 июля 2010

Все, что вам нужно знать о BackgroundWorker, включено msdn .

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

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


Обновление:

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

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

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

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

2 голосов
/ 20 июля 2010

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

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

1 голос
/ 20 июля 2010

позвони в свой класс

 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

    }
...