Фоновый работник не будет сообщать о прогрессе - PullRequest
18 голосов
/ 12 мая 2009

У меня есть фоновый работник, выполняющий длинную задачу базы данных. Я хочу показать индикатор выполнения во время выполнения задачи. Каким-то образом фоновый работник не будет сообщать о ходе выполнения задачи.

Вот что у меня есть:

BackgroundWorker _bgwLoadClients;

_bgwLoadClients = new BackgroundWorker();
_bgwLoadClients.WorkerReportsProgress = true;
_bgwLoadClients.DoWork += new DoWorkEventHandler(_bgwLoadClients_DoWork);
_bgwLoadClients.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_bgwLoadClients_RunWorkerCompleted);
_bgwLoadClients.ProgressChanged += new ProgressChangedEventHandler(_bgwLoadClients_ProgressChanged);
_bgwLoadClients.RunWorkerAsync(parms);

private void _bgwLoadClients_DoWork(object sender, DoWorkEventArgs e)
{
    DataTable dt = getdate();
    e.Result = dt;
}

void _bgwLoadClients_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}

Я делаю это в WPF, но, думаю, это не изменится.

Заранее спасибо

Ответы [ 6 ]

31 голосов
/ 13 мая 2009

Вам нужно разбить ваш метод DoWork на отчетный процесс и затем вызвать ReportProgress.

Возьмем, к примеру, следующее:

private void Something_DoWork(object sender, DoWorkEventArgs e) 
{
    // If possible, establish how much there is to do
    int totalSteps = EstablishWorkload();

    for ( int i=0; i<totalSteps; i++)
    {
        // Do something...

        // Report progress, hint: sender is your worker
        (sender as BackgroundWorker).ReportProgress((int)(100/totalSteps)*i, null);
    }

}

Если ваша работа не может быть предопределена, попробуйте добавить свои проценты:

private void Something_DoWork(object sender, DoWorkEventArgs e) 
{
    // some work

    (sender as BackgroundWorker).ReportProgress(25, null);

    // some work

    (sender as BackgroundWorker).ReportProgress(50, null);

    // some work

    (sender as BackgroundWorker).ReportProgress(60, null);

    // some work

    (sender as BackgroundWorker).ReportProgress(99, null);
}
10 голосов
/ 11 февраля 2011

Измените свойство WorkReportProgress объекта backgroundworker на true в окне свойств или в коде.

3 голосов
/ 13 мая 2009

Вам необходимо вызвать worker.ReportProgress (процентComplete) в вашем методе DoWork. процентовКомплект должен быть рассчитан на основе общей работы. Например:

for(int i =0; i != 100; i++) {
    // do something
    worker.ReportProgress(i);
}

Иногда бывает сложно разделить работу на несколько частей, чтобы можно было сообщить о прогрессе. К сожалению, BackgroundWorker не решает эту проблему, вы должны сделать это самостоятельно.

3 голосов
/ 13 мая 2009

Вы должны вручную ReportProgress() вызвать событие ProgressChanged .

2 голосов
/ 13 мая 2009

Ход выполнения должен быть отправлен из события DoWork, вызвав метод ReportProgress на BackgroundWorker. В вашем случае вы не можете сообщить о каком-либо прогрессе, потому что вся работа выполняется вне функции DoWork. Вы можете сообщать о прогрессе только до и после вызова getdate (), но не во время вызова, так как поток BackgroundWorker занят.

2 голосов
/ 12 мая 2009

просто сообщить о прогрессе на мероприятии по придворной

private void _bgwLoadClients_DoWork(object sender, DoWorkEventArgs e) {
    int progresValue0to100 = 75;
    (sender as System.ComponentModel.BackgroundWorker).ReportProgress(progresValue0to100);
    //do your jobs..
}

это работает так

...