BackgroundWorker クラスを使用して Windows フォーム アプリケーションにスレッドを実装する方法について読みました。ちょっとした質問があります。指定されたタスクを処理するために 5 つのスレッドを同時に実行したい場合、5 つの BackgroundWorker コントロールを作成する必要がありますか、それとも 1 つだけでよいのでしょうか?
2 に答える
ただ話している場合はBackgroundWorker
、5つのバックグラウンドワーカーを作成する必要があります。単に5つのスレッドが必要な場合は、自分で作成できます。問題は、進行状況と完了をUIスレッドに戻す方法になります。を使用すると、 /およびCompletedイベントBackgroundWorker
を使用してそれを実行できます。これで、ハンドラーを使用して必要なスレッドを生成し、およびを介してそれらのスレッドからUIスレッドへのデータの通信を管理することができます。WorkerReportsProgress
ReportProgress
BackgroundWorker
DoWork
ReportProgress
Completed
例えば:
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
Thread thread1 = new Thread(ThreadOneEntry);
thread1.Start();
Thread thread2 = new Thread(ThreadTwoEntry);
thread2.Start();
Thread thread3 = new Thread(ThreadThreeEntry);
thread3.Start();
Thread thread4 = new Thread(ThreadFourEntry);
thread4.Start();
Thread thread5 = new Thread(ThreadFiveEntry);
thread5.Start();
thread1.Join();
thread2.Join();
thread3.Join();
thread4.Join();
thread5.Join();
// do something to report results from threads1-5
}
もちろん、これは進歩に対して何もしません-それは非常にアプリケーション固有であり、私が思いついたものはあなたがすることとは完全に異なり、役に立たない可能性があります。ただし、各スレッドはBackgroundWorker.ReportProgress
メソッドを介して進行状況を直接報告する可能性があります。各スレッドにBackgroundWorker
インスタンスまたはReportProgress
メソッドへのデリゲートを与える必要があります。
また、バックグラウンドワーカーのスレッドの効果的な使用法ではなく、他のスレッドを待機する待機状態になります。DoWork
イベントハンドラーは、他のスレッドエントリの1つと同じように簡単にいくつかの作業を実行できます。 。
.NET 3.5以降を使用していて、結果のあるバックグラウンド作業を実行したい場合は、Task<T>
代わりに使用することをお勧めします。Thread
さらに、独自のスレッドをスピンアップしても、負荷分散は行われません。TPLを介したタスクは、独自の負荷分散を行います。
BackgroundWorkerは基本的に単一のスレッドであるため、複数のスレッドを実行する必要がある場合は、複数のインスタンスが必要になります。