我有一个运行长数据库任务的后台工作程序。我想在任务运行时显示进度条。不知何故,后台工作人员不会报告任务的进度。
这就是我所拥有的:
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中这样做,但我想它不会有所作为。
提前致谢
答案 0 :(得分:31)
您需要将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);
}
答案 1 :(得分:10)
在属性窗口或代码中将backgroundworker对象的 WorkReportProgress 属性修改为 true 。
答案 2 :(得分:3)
您必须手动致电ReportProgress()
以举起ProgressChanged事件。
答案 3 :(得分:3)
您需要在DoWork方法中调用worker.ReportProgress(percentComplete)。 应根据总工作量计算percentComplete。例如:
for(int i =0; i != 100; i++) {
// do something
worker.ReportProgress(i);
}
有时很难将作业分成几个块来报告进度。不幸的是,BackgroundWorker没有解决这个问题,你必须自己做。
答案 4 :(得分:2)
只报告dowork事件的进度
private void _bgwLoadClients_DoWork(object sender, DoWorkEventArgs e) {
int progresValue0to100 = 75;
(sender as System.ComponentModel.BackgroundWorker).ReportProgress(progresValue0to100);
//do your jobs..
}
它像这样工作
答案 5 :(得分:2)
必须通过在BackgroundWorker上调用ReportProgress方法从DoWork事件中发送进度。在您的情况下,您无法报告任何进度,因为所有工作都在DoWork功能之外完成。您只能在调用getdate()之前和之后报告进度,但不能在调用期间报告,因为BackgroundWorker线程正忙。