0

BackgroundWorker クラスを使用して Windows フォーム アプリケーションにスレッドを実装する方法について読みました。ちょっとした質問があります。指定されたタスクを処理するために 5 つのスレッドを同時に実行したい場合、5 つの BackgroundWorker コントロールを作成する必要がありますか、それとも 1 つだけでよいのでしょうか?

4

2 に答える 2

1

ただ話している場合はBackgroundWorker、5つのバックグラウンドワーカーを作成する必要があります。単に5つのスレッドが必要な場合は、自分で作成できます。問題は、進行状況と完了をUIスレッドに戻す方法になります。を使用すると、 /およびCompletedイベントBackgroundWorkerを使用してそれを実行できます。これで、ハンドラーを使用して必要なスレッドを生成し、およびを介してそれらのスレッドからUIスレッドへのデータの通信を管理することができますWorkerReportsProgressReportProgressBackgroundWorker DoWorkReportProgressCompleted

例えば:

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を介したタスクは、独自の負荷分散を行います。

于 2012-09-11T20:55:13.923 に答える
0

BackgroundWorkerは基本的に単一のスレッドであるため、複数のスレッドを実行する必要がある場合は、複数のインスタンスが必要になります。

于 2012-09-11T19:13:06.580 に答える