Подтвердить что ты не робот

Фоновый работник не будет сообщать о прогрессе

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

Это то, что у меня есть:

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, но думаю, это не изменит.

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

4b9b3361

Ответ 1

Вам нужно разбить метод 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);
}

Ответ 2

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

Ответ 4

Вам нужно вызвать employee.ReportProgress(percentComplete) в вашем методе DoWork. percentComplete следует вычислять на основе общей работы. Например:

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

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

Ответ 5

просто сообщите о прогрессе в событии dowork

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

он работает следующим образом

Ответ 6

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