1

問題は、特定のリソースが 1 秒あたり 1 つ以上の要求を処理できないことです。そのパラメーターを、そのリソースへのすべての同時呼び出しを管理するスレッド プールに渡したいと考えています。

このような種類のカスタム スレッド プールを提供するライブラリはありますか、それとも独自の実装を楽しみにしていますか?

4

6 に答える 6

1

.NET 4 を使用している場合は、 a を使用しBlockingCollection<T>てこれを実現できます。

アプリケーションの複数のスレッドから作業項目をブロッキング コレクションに追加し、GetConsumingEnumerable()を呼び出して項目を取得し、各要素を処理した後に必要な時間だけスリープして、1 秒あたり 1 リクエストにスロットルする専用スレッドを作成できます。

于 2010-08-06T19:59:34.227 に答える
0

Quartz.Netをチェックしたいかもしれません

于 2010-08-06T21:05:01.667 に答える
0

スレッドプールは必要ないと思います。

  • すべての並行処理を並行キューに入れます<>
  • キューからアイテムを取得し、処理後、次の処理の前に 1 秒間スリープする 1 つのスレッドを用意します。
  • 必要に応じて、タイマーを使用して、スレッドの代わりに 1 秒に 1 回次のタイマーを取得します。
于 2013-04-08T10:50:40.460 に答える
0

Microsoft Devlabs のReactive Extensionsを使用できます。Observable の処理速度を制限できる特別なThrottleオペレーターがあります。

Reactive Extensionsは最終製品ではありませんが、ライブラリを現在の形式で自由に使用および配布できることに注意してください。

于 2010-08-06T21:00:57.323 に答える
0

リソースが 1 つしかない場合は、リソースにフィードする入力スレッドのことを考えることができます。入力スレッドは、すべての「タスク プロデューサー」が要求またはジョブをフィードする入力キューを持つこともできます。スレッド間のものは、キューをブロックしている可能性があります:

ブロッキング キュー

于 2010-08-06T19:57:59.643 に答える
0

スレッドをスピンオフし、それをミューテックスでラップし、ロックを解放する前に 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 を実行時間の差だけ待機させることができます。

ちょっとホーキー。=)

于 2010-08-06T20:00:40.113 に答える