4

マルチスレッド WCF サービスのスレッド数を制限したいと考えています。なので、ThreadPool.SetMaxThread関数を使います。System.Timers今、特定の間隔でイベントを生成するために使用したいと思います。

しかし、その間、私のサービスはスレッドプールで実行する多くのアクションを受け取ります。タイマーが経過すると、アクションが ThreadPool のキューに入れられるため (期待されるタスクが 100,000 になることもあります)、実行が遅くなります。

以前に経過したイベントを実行する方法はありますか? たとえば、スレッドプールにキューに入れられた優先タスクを設定することによって?または、スレッドプールの外でイベントが経過しましたか?

サービス内のスレッドのグローバル制限を維持したいと考えています。

4

3 に答える 3

1

Taskfactory必要に応じて、 をブロッキング コレクションと組み合わせて使用​​することにより、プロデューサー/コンシューマー パターンをサポートするようにコードを変換できます。

コレクションを使用すると、上限を設定できます。

以下のリンクから:

- An implementation of the Producer-Consumer pattern.

- Concurrent adding and taking of items from multiple threads.

> - オプションの最大容量。

- Insertion and removal operations that block when collection is empty or 
  full.

- Insertion and removal "try" operations that do not block or that block
  up to a specified period of time.

- Encapsulates any collection type that implements
  IProducerConsumerCollection(Of T)

- Cancellation with cancellation tokens.

- Two kinds of enumeration with foreach (For Each in Visual Basic):

    - Read-only enumeration.

    - Enumeration that removes items as they are enumerated.

以下に、チェックする価値のあるリソースをいくつか示します。

ブロックコレクションとプロデューサー消費者問題
http://msdn.microsoft.com/en-us/library/dd997371.aspx
http://msdn.microsoft.com/en-us/library/dd267312. aspx

于 2012-11-22T20:43:39.450 に答える
0

この .NET Matters MSDN article ThreadPoolPriority, and MethodImplAttributeは少し古いですが、アプローチはまだ有効だと思います。彼の解決策は、マネージド プールから次に利用可能なスレッドが何を実行するかを定義する ThreadPriorityPool を作成することです。

もう 1 つのオプションは、CodeProjectでスマート スレッド プールを試すことです。優先順位による作業項目の順序付けを明示的にサポートします。

于 2012-11-23T07:02:49.090 に答える