带有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中看到的那样,它是在线程完成之后发生的。我可以滚动进度条,但是只能在完成工作后才能滚动。
我在这方面做错了什么?我希望它随着每个项目的完成而更新。
没有找到相关结果
已邀请:
1 个回复
需复
在UI线程上调用
,因此在另一个线程上调用。同时,辅助线程继续运行。由于没有太多工作要做,因此
会在ѭ6invoke实际调用该方法之前完成其工作,因为线程切换不会在每个CPU操作中发生。他们发生了很多之后。为避免这种情况,请手动调用使用
增加
的值的方法。