2009-02-25 268 views

答えて

84

シンプル:BackgroundWorkerを2回起動しないでください。

それはすでにIsBusyプロパティを使用して実行されている場合は、これだけ、このコード変更、確認することができます。これに

worker.RunWorkerAsync(); 

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

更新:これを行うと

を実際に複数のバックグラウンドタスクを同時に起動する必要がある場合は、複数のBackgroundWorkerオブジェクトを作成することができます

+0

ある程度、私はその答えが完全に有用ではないことに同意します。あなたが2つのバックグラウンドプロセスを実行する必要がある場合、「ワーカーを2回実行することはできません」というエラーを表示するのは賢明ではありません。私は、各タスクのために新しいbackgroundWorkersを実行することについての答えを前提としています - あるいは何らかの方法でジョブをキューに入れることはよりよい解決策です。システムの他の部分がすでにバックグラウンドジョブを開始し、それをuppon。 – Thies

51

実行する操作ごとに新しいBackgroundWorkerオブジェクトを作成します。すなわち、いうより:私が行われる必要があるタスクをqueue'ingになり

for (int i; i < max; i++) { 
    BackgroundWorker worker = new BackgroundWorker(); 
    worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
    worker.RunWorkerAsync(i); 
} 
+0

それは素晴らしい答えです。必要に応じてbackgroundWorkersをすべて削除するにはどうすればよいですか? –

+0

@VladSpreys私は本当にコメントだけでスレッドキャンセルを議論することはできませんが、件名にこのサイトのいくつかの本当に良い投稿があります。 –

+0

@ fatcat1111ありがとうございます。私はそれを参照している場合、スレッドをキャンセルするという考えを理解しています。しかし、このコードスニペットでは私たちはしません。 –

5

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です。私はスレッドセーフで実装されているかどうかは分かりません。私が作業している実装で現在のロックの問題を理解したら、私の答えを更新します。

+0

これはマルチスレッドが必要な場合の大きなアプローチです –

関連する問題