这里我使用多个backgroundworker
来做一个与网络相关的操作。基本上它是一个检查用户的过程是否在我的页面注册。我要检查近1000个帐户,因此我使用datagridview
来导入用户并从中获取用户名以进行检查。我的代码工作正常并显示结果,但问题是在更新datagridview
中的状态时效果不是很好。在那个漫长的流程方法中,我习惯为每个方法流程设置状态文本,例如login process started
logged in
failed to login
。但是Backgroundworker
不会更新状态列。它仅显示所有backgroundworker
完成后的状态。任何人都可以给我一个如何更新每个帐户的状态的想法?
提前谢谢
我的代码:
int threadNum;
public BackgroundWorker bcheker;
private void toolStripButton2_Click(object sender, EventArgs e)
{
if (wbcheckStatus == WorkerStatus.NotStarted || wblogcheckStatus == WorkerStatus.Completed)
{
threadNum = -1;
SetControlsStatus(ProgramStatus.BChecking);
toolStripButton2.Image = aTumblr.Properties.Resources.control_stop;
for (int i = 0; i < 4; i++)
{
bcheker = new BackgroundWorker();
bcheker.DoWork += new DoWorkEventHandler(bcheker_dowork);
bcheker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bchecker_completed);
bcheker.ProgressChanged +=bcheker_ProgressChanged;
bcheker.WorkerReportsProgress = true;
bcheker.WorkerSupportsCancellation = true;
bcheker.RunWorkerAsync();
}
}
else
{
threadNum = 10000;
bcheker.CancelAsync();
SetControlsStatus(ProgramStatus.BlogChecking);
}
}
public void bcheker_dowork(object sender, DoWorkEventArgs e)
{
while (!bcheker.CancellationPending)
{
int rownum = Interlocked.Increment(ref threadNum);
if (rownum >= bchecktableModel.Rows.Count)
{
break;
}
Thread.Sleep(1000);
BlogChecker bc = new BlogChecker(bchecktableModel[rownum, 1].Text, bchecktableModel[rownum, 2]);
bc.check();
wblogcheckStatus = WorkerStatus.Running;
}
if (bcheker.CancellationPending)
{
wblogcheckStatus = WorkerStatus.Completed;
SetControlsStatus(ProgramStatus.BCheckingDone);
}
}
public void bcheker_ProgressChanged(Object sender, ProgressChangedEventArgs e)
{
}
public void bchecker_completed(object sender, EventArgs e)
{
if (threadNum == bchecktableModel.Rows.Count+1)
{
SetControlsStatus(ProgramStatus.BCheckingDone);
wblogcheckStatus = WorkerStatus.Completed;
}
}
答案 0 :(得分:0)
首先,看起来您有多个处理程序注册到DoWorkEvent的问题
我不确定发生了什么,但我会检查调用bcheker_dowork
方法的时间。
要报告您的进度,请使用BackgroundWorker.ReportProgress方法。
public void bcheker_ProgressChanged(Object sender, ProgressChangedEventArgs e)
{
//Update your progress here
}
答案 1 :(得分:0)
此外,在您的DoWork()方法中,您不应该使用“bcheker”,因为它只是引用最后创建的BackgroundWorker。而是将sender参数强制转换为本地BackgroundWorker变量并使用它。