0

C# を使用して、Visual Studio 2008 で最初の ThreadPool アプリケーションに取り組んでいます。

SQL Server のデータを使用して、2,000 ~ 4,000 個の部品について計算を実行する必要があるレポートがあります。

私はすべての部品番号を ThreadPool にキューイングしています。ここで部品番号が外れて結果が計算されます。これらのスレッドが終了すると、RegisterWaitForSingleObject イベントが発生して、キュー項目のハンドルを登録解除します。

すべてのキュー アイテムが終了した後、それらを ThreadPool から削除する方法はありますか?

どうやら、誰かが 2000 から 4000 個のパーツの新しいセットを使用して別のレポートを実行した場合、以前のパーツの配列を削除する方法がありません。

以前にキューに入れられたアイテムを削除するにはどうすればよいですか? workerThreads = 0 で SetMaxThreads を呼び出しますか?

実験できることはわかっていますが、その週のほとんどを実験に浪費する可能性があります。

時間をありがとう、
ジョー

4

2 に答える 2

4

アイテムが完了するThreadPoolと、キューから自動的に削除されます。彼らがそうではないことをあなたに示しているのは何ですか?

于 2009-09-21T15:49:07.397 に答える
2

現在のキューでの作業を中断(キャンセル)するつもりであると仮定します...

max-threadsを変更しても、保留中の作業には影響しません。それを行うために利用可能なスレッドの数を変更するだけです-そしてこれを台無しにすることは一般的に悪い考えです(あなたのコードだけがを使用しているわけではありませんThreadPool)。カスタムキューを使用します。基本的な(スレッドセーフな)プロデューサー/コンシューマーキューを作成するのはかなり簡単です。または、.NET4.0には非常に優れたカスタムスレッドキューがいくつか含まれています。

次に、カスタムキューを中止して、新しいキューを開始できます。

ここに簡単なものを書きました; 現時点では、終了する前にクリーンに終了する(つまり、キューが空になるまでキューを排出する)必要がありますが、現在のアイテムの直後に停止するフラグを追加するのは簡単です(スレッドの中断/中止に頼らないでください。実行の任意のポイント。決して良い考えではありません)。

于 2009-09-21T15:49:51.497 に答える