带有ProgressBar的C#BackGroundWorker在进程完成后进行更新

|| 我在按钮单击事件中具有以下内容:
private void buttonSubmitAchChecks_Click(object sender, EventArgs e)
{
  if (backgroundWorker1.IsBusy) return;
  SubmittingAch(true);

  backgroundWorker1.WorkerReportsProgress = true;
  backgroundWorker1.WorkerSupportsCancellation = true;

  label_Status.Text = \"Submitting checks to ACH ....\";
  var qry = from ds in checkTrans.IndividualCheck
            where ds.SubmitToACH &&
                  ds.Status == \"Entered\" &&
                  ds.CheckAmount > 0 &&
                  ds.SubmitToACH
            select ds;

  if (qry.Count() <= 0)
  {
    label_Status.Text = \"Nothing to submit. Check the Check Amount, ACH, and Status fields.\";
  }
  else
  {
    progressBar1.Maximum = qry.Count();
    progressBar1.Minimum = 0;
    progressBar1.Step = 1;
    backgroundWorker1.RunWorkerAsync(qry);
  }

}
我的backgroundWorker1_DoWork:
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
  if (backgroundWorker1.CancellationPending)
  {
    e.Cancel = true;
  }
  else
  {
    var qry = e.Argument as EnumerableRowCollection<CheckTrans.IndividualCheckRow>;
    if (qry != null)
    {
      Thread.Sleep(4000);

      //item.Status = ach.SubmitCheck(item);
      var ach = new SubmitAchChecks();
      foreach (var item in qry)
      {
        ach.SubmitCheck(item);
        backgroundWorker1.ReportProgress(1);
        Console.Write(\"backgroundWorker1_dowork=\" + progressBar1.Value.ToString() + \"\\r\\n\");
      }
    }

  }

}
我的取消按钮:
private void cancelAsyncButton_Click(object sender, EventArgs e)
{
  if (backgroundWorker1.WorkerSupportsCancellation == true)
  {
    label_Status.Text = \"Cancelling...\";
    backgroundWorker1.CancelAsync();
  }
}
我的backgroundWorker1_RunWorker已完成:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  if (e.Cancelled == true)
  {
    label_Status.Text = \"Canceled!\";
  }
  else if (e.Error != null)
  {
    label_Status.Text = \"Error: \" + e.Error.Message;
  }
  else
  {
    label_Status.Text = \"Done!\";
  }
  SubmittingAch(false);
}
我的backgroundWorker1_ProgressChanged:
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
  progressBar1.Value += 1;
  Console.Write(\"progressbar1.value=\" + progressBar1.Value.ToString() + \"\\r\\n\");
}
处理2个项目时,在调试窗口中得到以下输出: backgroundWorker1_dowork = 0 backgroundWorker1_dowork = 0 progressbar1.value = 1 progressbar1.value = 2 该事件正在触发,但是正如您从console.write中看到的那样,它是在线程完成之后发生的。我可以滚动进度条,但是只能在完成工作后才能滚动。 我在这方面做错了什么?我希望它随着每个项目的完成而更新。
已邀请:
这是由于线程的工作方式所致。使用
BeginInvoke
在UI线程上调用
ProgressChange
,因此在另一个线程上调用。同时,辅助线程继续运行。由于没有太多工作要做,因此
BackgroundWorker
会在ѭ6invoke实际调用该方法之前完成其工作,因为线程切换不会在每个CPU操作中发生。他们发生了很多之后。为避免这种情况,请手动调用使用
this.Invoke()
增加
ProgressBar
的值的方法。

要回复问题请先登录注册