Этот BackgroundWorker в настоящее время занят и не может выполнять несколько задач одновременно - PullRequest
47 голосов
/ 26 февраля 2009

Я получаю эту ошибку, если дважды щелкнуть кнопку, которая запускает фонового работника.

This BackgroundWorker is currently busy and cannot run multiple tasks concurrently

Как мне этого избежать?

Ответы [ 4 ]

88 голосов
/ 26 февраля 2009

Простой: не запускайте BackgroundWorker дважды.

Вы можете проверить, работает ли он уже, используя свойство IsBusy, поэтому просто измените этот код:

worker.RunWorkerAsync();

к этому:

if( !worker.IsBusy )
    worker.RunWorkerAsync();
else
    MessageBox.Show("Can't run the worker twice!");

Обновление:

Если вам действительно нужно запустить несколько фоновых задач одновременно, вы можете просто создать несколько объектов BackgroundWorker

53 голосов
/ 21 марта 2009

Создайте новый объект 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);
}
6 голосов
/ 26 августа 2010

Я бы посмотрел в очередь задачи, которые необходимо выполнить. Вы получаете следующие преимущества:

  • Вам не нужно решать проблемы фоновых задач, которые невозможно запустить из-за чего-то уже запущенного
  • Вам не нужно беспокоиться об использовании слишком большого количества потоков, создавая новый фон для каждой задачи.
  • Наконец, очередь может позволить вам убедиться, что фоновые задачи выполняются в том же порядке, в котором они были созданы / запрошены.

Вот пример реализации: http://thevalerios.net/matt/2008/05/a-queued-backgroundworker. Я не уверен, что реализация в threadsafe, и я обновлю свой ответ, как только выясню мою текущую проблему блокировки в реализации, с которой я работаю.

1 голос
/ 24 апреля 2018

Хотя это и не тот случай, который изначально задан ОП, это также может произойти из-за состояния гонки (случилось со мной сейчас, и я искал ответ), если вы используете Фонового работника в некотором роде производителя-потребителя. шаблон.

Пример:

if (BckgrndWrkr == null)
{
    BckgrndWrkr = new BackgroundWorker(); 
    BckgrndWrkr.DoWork += DoWorkMethod;
    BckgrndWrkr.RunWorkerAsync();     
}
else if (!BckgrndWrkr.IsBusy)
{
    BckgrndWrkr.RunWorkerAsync();
}

В этом случае есть условие гонки: первый экземпляр создает нового фонового работника, второй экземпляр достигает else if и запускает фонового работника, прежде чем 1-й экземпляр достигнет RunWorkerAsync блока if, и когда он это сделает выдает ошибку.

Этого можно избежать, добавив блокировку ко всему разделу if + if else.

...