Фоновый работник не будет сообщать о прогрессе
У меня есть фоновый рабочий, выполняющий длинную задачу базы данных. Я хочу показать индикатор выполнения во время выполнения задачи. Как-то фоновый работник не будет сообщать о ходе выполнения задачи.
Это то, что у меня есть:
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, но думаю, это не изменит.
Заранее спасибо
Ответы
Ответ 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 либо в окне свойств, либо в коде.
Ответ 3
Вам нужно вручную вызвать ReportProgress()
, чтобы поднять ProgressChanged.
Ответ 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 занят.