Этот BackgroundWorker в настоящее время занят и не может одновременно выполнять несколько задач
Я получаю эту ошибку, если я нажму кнопку, которая дважды запускает фонового рабочего.
This BackgroundWorker is currently busy and cannot run multiple tasks concurrently
Как я могу избежать этого?
Ответ 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. Я не уверен, что реализация в потокобезопасных, и я буду обновлять свой ответ, как только выясню мою текущую проблему блокировки в реализации, с которой я работаю.