0

私は(C#で)作成しているプログラムを持っています.2つのアプローチがあります..

1) 任意の数の X スレッドが終了するのを待つジョブ マネージャー。終了すると次の作業チャンクを取得し、新しいスレッドを作成してそのチャンクを与えます。

また

2) 開始する X スレッドを作成し、それぞれに作業のチャンクを与えます。スレッドがチャンクを終了すると、ジョブ マネージャーに追加の作業を要求します。それ以上仕事がない場合は、スリープしてから再度質問し、スリープは次第に長くなります。

このプログラムは実行されて完了しますが、より多くの仕事を継続的に探すサービスに変わることがわかりました.

各チャンクは、いくつかのデータ ID、情報を取得するためのデータベースへの呼び出し、またはデータ ID に対する操作の実行、およびデータ ID に関するデータベース情報への書き込みで構成されます。

4

4 に答える 4

2

マルチスレッド データベース操作を処理する際に講じる必要がある追加の予防措置を認識していると仮定すると、2 つの異なるシナリオについて説明しているように思えます。最初に、いくつかのスレッドを実行していて、それらがすべて終了すると、新しい作業を探します。2 番目の例では、複数のスレッドが実行されており、それらの操作は完全に並列です。あなたの環境は、取るべき適切なアプローチを決定するものになるでしょう。すべての作業が完了するまで追加の作業を続行できないいくつかのスレッドですべての作業を結び付ける何かがある場合は、前者を使用します。それらが互いにあまり影響を与えない場合は、後者を使用してください。

于 2009-03-31T14:54:23.467 に答える
1

2 番目のオプションは、実際には適切ではありません。スリープ時間を徐々に長くすると、それらのスレッドを不必要にブロックしたままにすることになるからです。

むしろ、2 番目のオプションのように一連のスレッドをプールする必要がありますが、WaitHandles を使用して作業を待機し、プロデューサー/コンシューマー パターンを使用します。基本的に、プロデューサーが作業があることを示すと、コンシューマーにシグナルを送信します (どのスレッドがワークを取得するかを決定し、そのスレッドにシグナルを送るマネージャーが存在します)。

Parallel Task Library を調べることをお勧めします。現在はベータ版ですが、これを使用して快適に使用できる場合は、これをお勧めします。最適なスレッド数など)。

于 2009-03-31T14:56:49.497 に答える
-1

独自のソリューションを展開する代わりにThreadPool、.NET フレームワークのクラスを確認する必要があります。メソッドを使用できますQueueUserWorkItem。それはあなたが達成したいことを正確に行うべきです。

于 2009-03-31T14:55:44.650 に答える