問題は、特定のリソースが 1 秒あたり 1 つ以上の要求を処理できないことです。そのパラメーターを、そのリソースへのすべての同時呼び出しを管理するスレッド プールに渡したいと考えています。
このような種類のカスタム スレッド プールを提供するライブラリはありますか、それとも独自の実装を楽しみにしていますか?
問題は、特定のリソースが 1 秒あたり 1 つ以上の要求を処理できないことです。そのパラメーターを、そのリソースへのすべての同時呼び出しを管理するスレッド プールに渡したいと考えています。
このような種類のカスタム スレッド プールを提供するライブラリはありますか、それとも独自の実装を楽しみにしていますか?
.NET 4 を使用している場合は、 a を使用しBlockingCollection<T>
てこれを実現できます。
アプリケーションの複数のスレッドから作業項目をブロッキング コレクションに追加し、GetConsumingEnumerable()を呼び出して項目を取得し、各要素を処理した後に必要な時間だけスリープして、1 秒あたり 1 リクエストにスロットルする専用スレッドを作成できます。
Quartz.Netをチェックしたいかもしれません
スレッドプールは必要ないと思います。
Microsoft Devlabs のReactive Extensionsを使用できます。Observable の処理速度を制限できる特別なThrottleオペレーターがあります。
Reactive Extensionsは最終製品ではありませんが、ライブラリを現在の形式で自由に使用および配布できることに注意してください。
リソースが 1 つしかない場合は、リソースにフィードする入力スレッドのことを考えることができます。入力スレッドは、すべての「タスク プロデューサー」が要求またはジョブをフィードする入力キューを持つこともできます。スレッド間のものは、キューをブロックしている可能性があります:
スレッドをスピンオフし、それをミューテックスでラップし、ロックを解放する前に 1 秒間待機させます。そうすれば、これらのスレッドを生成しているプロセスが何であれ、新しいスレッドはそれぞれ、プロシージャにアクセスする前に整列する必要があります。
2 番目のスレッドはすぐにスピンオフされますが、Mutex のためにすぐにキューに入れられます。
例えば
{
Thread t = new Thread(()=>{DoSomething();}).Start();
Thread t2 = new Thread(()=>{DoSomething();}).Start();
}
private static Mutex _mutex = new Mutex();
private void DoSomething()
{
_mutex.WaitOne();
// Do Work
Sleep(1000);
_mutex.ReleaseMutex();
}
オプションで、本当に具体的に取得したい場合は、System.Diagnostics クラスを使用して、プロシージャの開始から終了までの実行を追跡し、Thread.Sleep を実行時間の差だけ待機させることができます。
ちょっとホーキー。=)