Backgroundworker不会报告进度

Ang*_*ela 18 c# wpf progress 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;
}
Run Code Online (Sandbox Code Playgroud)

我在WPF中这样做,但我想它不会有所作为.

提前致谢

Ray*_*yes 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 编程不错,数学不好;-)(int)(100.0/totalSteps*i) (6认同)

小智 10

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