0

我有一种用于从服务器下载文件的方法。我的方法工作正常,但是我想返回在每个执行实例中执行的进程的计算百分比。我尝试使用 backgroundworker 并为我的进度条使用 backgroundworker_changed 方法,如下所示。

  bw.WorkerReportsProgress = true;
            bw.WorkerSupportsCancellation = true;
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);

单击按钮启动工作人员。

private void btnStart_Click(object sender, EventArgs e)
        {


                if (bw.IsBusy != true)
                {

                    bw.RunWorkerAsync();

                }

        }

worker_changed 方法

 private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar.Value = e.ProcessPercentage;
        }

我的问题是,我知道我必须报告 DoWork() 方法的进度。请问我该如何实现?我想过做这样的事情。

  private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar.Value = Convert.ToInt32( e.UserState );

        }

它仍然没有触发,因为 DoWork 没有返回任何进展。任何帮助,将不胜感激。

4

2 回答 2

0

正如msdn的官方教程中所解释的那样。您必须在方法中自己报告进度更改DoWork。这是一个例子:

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;

    worker.ReportProgress(10/*the percentage you want*/);
}

事件BackgroundWorker.ProgressChanged

在调用 ReportProgress 方法时引发

它旨在:

添加代码以指示进度,例如更新用户界面。

事件BackgroundWorker.RunWorkerCompleted

当后台操作完成、取消或引发异常时发生

这两个事件都旨在在您的DoWork方法失败、结束或调用该ReportProgress方法时调用。所以换句话说,我们可以说你是决定它们何时发生的人。没有您的行动就无法完成,这是您的过程,只有您知道它何时完成 20%、30% 或 100%(等等......)。

于 2013-11-01T10:24:30.003 回答
0

您需要ReportProgress从您的DoWork方法以及百分比 int 值中调用。

例如:

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
     //you can safely pass data out of the thread via the 'obj'
     bw.ReportProgress(0, obj); 
}
于 2013-11-01T10:20:49.707 回答