Backgroundworker不会报告进度

我有一个后台工作程序运行长数据库任务。 我想在任务运行时显示进度条。 不知何故,后台工作人员不会报告任务的进度。

这就是我所拥有的:

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中这样做,但我想它不会有所作为。

提前致谢

您需要将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 

如果您的工作无法预先确定,请尝试添加自己的百分比:

 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); } 

在属性窗口或代码中将backgroundworker对象的WorkReportProgress属性修改为true

您必须手动调用ReportProgress()来引发ProgressChanged事件。

您需要在DoWork方法中调用worker.ReportProgress(percentComplete)。 应根据总工作量计算percentComplete。 例如:

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

有时很难将作业分成几个块来报告进度。 不幸的是,BackgroundWorker没有解决这个问题,你必须自己做。

只报告dowork事件的进展情况

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

它的工作原理如下

必须通过在BackgroundWorker上调用ReportProgress方法从DoWork事件中发送进度。 在您的情况下,您无法报告任何进度,因为所有工作都在DoWorkfunction之外完成。 您只能在调用getdate()之前和之后报告进度,但是在BackgroundWorker线程忙的情况下不会在调用期间报告进度。