如果我单击启动后台工作程序两次的按钮,则会收到此错误。
This BackgroundWorker is currently busy and cannot run multiple tasks concurrently
如何避免这种情况?
简单:不要启动BackgroundWorker两次。
您可以使用
IsBusy
属性检查它是否已经在运行,因此只需更改以下代码:
worker.RunWorkerAsync();
对此:
if( !worker.IsBusy )
worker.RunWorkerAsync();
else
MessageBox.Show("Can't run the worker twice!");
更新:
如果你确实需要同时启动多个后台任务,你可以简单地创建多个BackgroundWorker对象
为您要执行的每个操作创建一个新的BackgroundWorker 对象。即,而不是:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
for (int i; i < max; i++) {
worker.RunWorkerAsync(i);
}
试试这个:
for (int i; i < max; i++) {
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync(i);
}
我会考虑对需要完成的任务进行排队。您将获得以下优势:
示例:
if (BckgrndWrkr == null)
{
BckgrndWrkr = new BackgroundWorker();
BckgrndWrkr.DoWork += DoWorkMethod;
BckgrndWrkr.RunWorkerAsync();
}
else if (!BckgrndWrkr.IsBusy)
{
BckgrndWrkr.RunWorkerAsync();
}
在这种情况下,存在竞争条件:第一个实例实例化一个新的后台工作程序,第二个实例到达
else if
并启动后台工作程序,在第一个实例到达
if
块的 RunWorkerAsync 之前,当它到达时,它会抛出错误。可以通过向整个 if + if else 部分添加锁来避免这种情况。