Подтвердить что ты не робот

Этот BackgroundWorker в настоящее время занят и не может одновременно выполнять несколько задач

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

This BackgroundWorker is currently busy and cannot run multiple tasks concurrently

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

4b9b3361

Ответ 1

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

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

worker.RunWorkerAsync();

:

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

Update:

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

Ответ 2

Создайте новый объект BackgroundWorker для каждой операции, которую вы хотите выполнить. I.e., а не:

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);
}

Ответ 3

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

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

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