首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >后台工作人员不报告进度

后台工作人员不报告进度
EN

Stack Overflow用户
提问于 2009-05-12 19:53:06
回答 5查看 37K关注 0票数 18

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

这就是我所拥有的:

代码语言:javascript
复制
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做这件事,但我猜这不会有什么不同。

提前感谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-05-12 20:15:01

您需要将DoWork方法分解为可报告的进程,然后调用ReportProgress。

以下面的例子为例:

代码语言:javascript
复制
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);
    }

}

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

代码语言:javascript
复制
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);
}
票数 31
EN

Stack Overflow用户

发布于 2009-05-12 20:00:41

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

票数 3
EN

Stack Overflow用户

发布于 2009-05-12 20:03:13

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

代码语言:javascript
复制
for(int i =0; i != 100; i++) {
    // do something
    worker.ReportProgress(i);
}

有时很难将作业划分为几个区块,以便能够报告进度。不幸的是,BackgroundWorker不能解决这个问题,你必须自己去做。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/854548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档