私が想定しているのは、かなり一般的なスレッド化シナリオです。
- 完了しなければならない同じ仕事が 100 件あります
- すべてのジョブは互いに独立しています
- 一度に最大15件のジョブを処理したい
- 各ジョブが完了すると、すべてのジョブが完了するまで新しいジョブが開始されます
各ジョブが完了時にイベントを発生させると仮定すると (私は BackgroundWorker クラスを使用しています)、これを実行する方法はいくつか考えられますが、「正しい」解決策が何であるかはわかりません。そこにいるあなたの教祖の何人かが私を正しい方向に向けることができることを望んでいました.
解決策 1:しばらくお待ち ください(続行) { Threading.Sleep(1000); Main()関数でループします。Job_Completed イベント ハンドラーのコードは、A)キューに入れられるジョブが残っておらず、B)キューに入れられたすべてのジョブが完了した場合に、continue = false を設定します。以前にこのソリューションを使用したことがありますが、うまく機能しているように見えます...私には少し「奇妙」に思えます。
解決策 2: Main() 関数で Application.Run() を使用します。同様に、Job_Completed イベント ハンドラーのコードは、A)キューに入れるジョブが残っていない場合、およびB)キューに入れられたすべてのジョブが完了した場合に、Application.Exit() を呼び出します。
解決策 3: ThreadPool を使用し、500 ~ 1000 のすべての要求をキューに入れ、一度に 10 個ずつ実行し (SetMaxThreads)、何らかの形ですべてが完了するのを待ちます。
これらすべてのソリューションの基本的な考え方は、ジョブがなくなるまで、別のジョブが完了するたびに新しいジョブが開始されるというものです。したがって、問題は既存のジョブが完了するのを待つだけでなく、保留中のジョブがなくなるまで待機することでもあります。ThreadPool が正しい解決策である場合、ThreadPool を待機してキューに入れられたすべてのアイテムを完了する正しい方法は何ですか?
ここでの最大の混乱は、Main() 関数内からイベントを発生させる方法を正確に理解していないことだと思います。どうやらそうらしいのですが、Windows メッセージ ループの観点からは、その仕組みがわかりません。この問題を解決する正しい方法は何ですか?またその理由は何ですか?