此BackgroundWorker当前正忙,无法同时运行多个任务

如果我单击一个启动backgroundworker两次的按钮,我会收到此错误。
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);
}
    
我会考虑排队需要完成的任务。您将获得以下优势; 您不必处理由于已经运行的其他内容而无法启动后台任务的问题 通过为每个任务创建新的背景,您不必担心使用太多线程。 最后,队列可以允许您确保后台任务的运行顺序与创建/请求的顺序相同。 以下是一个示例实现:http://thevalerios.net/matt/2008/05/a-queued-backgroundworker。我不确定是否在线程安全中实现,并且一旦我在我正在使用的实现中找出当前的锁定问题,我将更新我的答案。     
尽管不是最初由OP提出的情况,但如果您在某种生产者 - 消费者模式中使用背景工作者,这也可能由于竞争条件(现在发生在我身上并寻找答案)而发生。 例:
if (BckgrndWrkr == null)
{
    BckgrndWrkr = new BackgroundWorker(); 
    BckgrndWrkr.DoWork += DoWorkMethod;
    BckgrndWrkr.RunWorkerAsync();     
}
else if (!BckgrndWrkr.IsBusy)
{
    BckgrndWrkr.RunWorkerAsync();
}
在这种情况下,有一个竞争条件:第一个实例实例化一个新的后台工作程序,第二个实例到达
else if
并启动后台工作程序,在第一个实例到达
if
块的RunWorkerAsync之前,当它执行时它会抛出错误。 通过向整个if + if else部分添加锁定可以避免这种情况。     

要回复问题请先登录注册