バックグラウンドワーカーを2回起動するボタンをクリックするとこのエラーが発生します。このBackgroundWorkerは現在ビジー状態で、複数のタスクを同時に実行することはできません
This BackgroundWorker is currently busy and cannot run multiple tasks concurrently
どうすればこの問題を回避できますか?
バックグラウンドワーカーを2回起動するボタンをクリックするとこのエラーが発生します。このBackgroundWorkerは現在ビジー状態で、複数のタスクを同時に実行することはできません
This BackgroundWorker is currently busy and cannot run multiple tasks concurrently
どうすればこの問題を回避できますか?
シンプル:BackgroundWorkerを2回起動しないでください。
それはすでにIsBusy
プロパティを使用して実行されている場合は、これだけ、このコード変更、確認することができます。これに
worker.RunWorkerAsync();
:
if(!worker.IsBusy)
worker.RunWorkerAsync();
else
MessageBox.Show("Can't run the worker twice!");
更新:これを行うと
を実際に複数のバックグラウンドタスクを同時に起動する必要がある場合は、複数のBackgroundWorkerオブジェクトを作成することができます
実行する操作ごとに新しいBackgroundWorkerオブジェクトを作成します。すなわち、いうより:私が行われる必要があるタスクをqueue'ingになり
for (int i; i < max; i++) {
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync(i);
}
それは素晴らしい答えです。必要に応じてbackgroundWorkersをすべて削除するにはどうすればよいですか? –
@VladSpreys私は本当にコメントだけでスレッドキャンセルを議論することはできませんが、件名にこのサイトのいくつかの本当に良い投稿があります。 –
@ fatcat1111ありがとうございます。私はそれを参照している場合、スレッドをキャンセルするという考えを理解しています。しかし、このコードスニペットでは私たちはしません。 –
:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
for (int i; i < max; i++) {
worker.RunWorkerAsync(i);
}
はこれを試してみてください。次の利点があります。
ここに実装例があります:http://thevalerios.net/matt/2008/05/a-queued-backgroundworkerです。私はスレッドセーフで実装されているかどうかは分かりません。私が作業している実装で現在のロックの問題を理解したら、私の答えを更新します。
これはマルチスレッドが必要な場合の大きなアプローチです –
ある程度、私はその答えが完全に有用ではないことに同意します。あなたが2つのバックグラウンドプロセスを実行する必要がある場合、「ワーカーを2回実行することはできません」というエラーを表示するのは賢明ではありません。私は、各タスクのために新しいbackgroundWorkersを実行することについての答えを前提としています - あるいは何らかの方法でジョブをキューに入れることはよりよい解決策です。システムの他の部分がすでにバックグラウンドジョブを開始し、それをuppon。 – Thies