backgroundWorker取消后,重新开始就报错:此 BackgroundWorker 当前正忙,无法同时运行多个任务。

civilman 2010-09-22 09:41:15
使用BackgroundWorker控件,有2个按钮buttonBegin和buttonCancel。
其他都正常,只是在用buttonBegin开始运行,然后点击buttonCancel取消后,到这里都正常。
可当再次点击buttonBegin时,就报错说:
“此 BackgroundWorker 当前正忙,无法同时运行多个任务。”

查过资料,说是:this.backgroundWorker1.CancelAsync()只是将CancellationPending设置为true,并没有终止进程。
我现在想做的是,取消后,重新点击buttonBegin会重新运行。
感觉应该在buttonCancel_Click后面增加个终止该backgroundWorker1的方法,可查了半天也没找到。


代码如下:


private void buttonBegin_Click(object sender, EventArgs e)
{
string[] pramlist = { "0"};
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
backgroundWorker1.RunWorkerAsync(pramlist);
}

private void buttonCancel_Click(object sender, EventArgs e)
{
this.backgroundWorker1.CancelAsync();
buttonCancel.Enabled = false;
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
string[] pramlist = (string[])e.Argument;
e.Result = DownLoad(worker, e, pramlist);
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
labelMsg.Text = string.Format("下载中{0}%,{1}", e.ProgressPercentage, e.UserState.ToString());
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
else if (e.Cancelled)
{
labelMsg.Text = "下载被取消!";
}
else
{
this.progressBar1.Value = 0;
labelMsg.Text = bool.Parse(e.Result.ToString()) ? "下载成功!" : "下载失败!";
}
buttonCancel.Enabled = false;
}
private bool DownLoad(BackgroundWorker worker, DoWorkEventArgs e, string[] pramlist)
{
for (int i = 0; i < 100; i++)
{
System.Threading.Thread.Sleep(1000);

worker.ReportProgress(i, "下载开始");
}

return true;
}

...全文
1484 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyq11 2010-09-22
  • 打赏
  • 举报
回复
需要在DoWork判断是否已经取消了,如果取消了,需要返回
backgroundworker有IsBusy属性,直接检测
bloodish 2010-09-22
  • 打赏
  • 举报
回复
CancelAsync之后,BackgroundWorker.CancellationPending = true
你要自己处理,具体如下:

private bool DownLoad(BackgroundWorker worker, DoWorkEventArgs e, string[] pramlist)
{
for (int i = 0; i < 100; i++)
{
if(worker.CancellationPending)
{
return false;
}
System.Threading.Thread.Sleep(1000);

worker.ReportProgress(i, "下载开始");
}

return true;
}




其次Begin加IsBusy判断
private void buttonBegin_Click(object sender, EventArgs e)
{
if(backgroundWorker1.IsBusy)
{
return;
}
string[] pramlist = { "0"};

backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
backgroundWorker1.RunWorkerAsync(pramlist);
}
healer_kx 2010-09-22
  • 打赏
  • 举报
回复
别用控件,你直接用class,每次用之前new个新的对象即可。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧