18

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

这就是我所拥有的:

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

提前致谢

4

6 回答 6

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);
}
于 2009-05-12T20:15:01.217 回答
11

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

于 2011-02-11T08:18:51.240 回答
3

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

于 2009-05-12T20:00:41.333 回答
3

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

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

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

于 2009-05-12T20:03:12.670 回答
2

只报告dowork事件的进展

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

它像这样工作

于 2009-05-12T19:59:17.950 回答
2

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

于 2009-05-12T21:47:07.430 回答