2012-03-25 16 views
12

異なるタスクキューを維持する必要がある環境が必要です。それぞれのキューに対して、実行可能な並行スレッドの数を定義する必要があります。このようなもの:c#タスクマルチキュー調整

  • キュー1 - > 3スレッド;
  • キュー2 - > 6スレッド。

種類のタスクシステム。私は自分自身で、1年以上にわたって正常に機能する普通の古いC#コード(別名System.Threading.Thread、ロックとキュー)を実装しています。しかし、私はTaskFactoryとTaskSchedulerの不思議について記事を読んでいますが、.NETで組み込みのクラスを使ってこのことを可能にしていることについてはわかりましたが、これを実証するための例は見つかりませんでした。私はそれを試してみて、今働いているかどうかを今見ているものと比較して、それがあればそれを置き換えてみたい。

キュー#1が実行されていてもキュー#2を対象とするアイテムが即座に実行された場合、guaranteeを取得できる限り、キューごとに並列スレッドの数を制限または設定する必要はありません。全負荷時。

だから、私の質問です.net4以上のものがあります。誰かが私にサンプルを指すことができますか?私は1週間に1つを探していて、関連性のあるものを得ることに失敗しました。

答えて

3

this exampleで説明したLimitedConcurrencyLevelTask​​Schedulerを作成するか、優先度スケジューラhereを参照してください。

+0

OPが望んでいると思われるものを実現するには、タスクを優先キューで発行するだけでは不十分です。キュー#2のタスクを実行するスレッドは、キュー#1を処理するスレッドよりも高い優先順位で実行する必要があります。これらのソリューションがこれを可能にすることは明らかではありませんか? –

+1

はい、確かにこれは私が必要とするものと一致するものです。これは異なるキューを実装し、同時に実行できる要素の最大数を制限し、他のアイテムを最初のキューと並行して実行するために2番目のキューを停止しません。ありがとう! – dcg

6

これは実際にはTPLと新しいコレクションSystem.Collections.Concurrentを使用するとかなり簡単です。

お客様のニーズに合わせて、BlockingCollection<T>をお勧めします。デフォルトでは、ConcurrentQueue<T>を基になるストアとして使用します。これは、必要なものに最適です。

var queue = new BlockingCollection<Message>(); 

それらのメッセージに取り組んでいくつかのコードを設定して、並列に何を実行することができます制御するには、このように簡単です:

//Set max parallel Tasks 
var options = new ParallelOptions 
{ 
    MaxDegreeOfParallelism = 10 
}; 

Parallel.ForEach(queue.GetConsumingEnumerable(), options, msg => 
{ 
    //Do some stuff with this message 
}); 

だから何がここで起こっていますか?まあ...

GetConsumingEnumerable()の呼び出しは、実際には何かが消費するまでqueueにブロックされます。これは、新しい作業を行う準備ができていることを知らせるために余分なコードが必要ないため、素晴らしいことです。むしろ、queueがいっぱいになると、あなたの(匿名)代理人の新しいタスクがアイテムで開始されます。

ParallelOptionsオブジェクトを使用すると、Parallel.ForEachの動作を制御できます。この場合、あなたは一度に10以上のタスクを実行することを決して望んでいません。 Tasks!= Threadsに注意することが重要です。細部は暗いですが、言うまでもなく、ボンネットの下では多くの最適化が行われています。すべてのプラグイン可能な心ですが、それは心がかすかなものではありません。

私はここでは説明していない多くの詳細は明らかですが、うまくいけば、タスクパラレルライブラリを使用すると、どのようにシンプルで表現力豊かなのかが分かります。

+0

OPには優先順位キューと優先スレッドが必要であるようですが、最初にキュー#2のアイテムを実行します。 –

+2

それは私が持っている印象ではありません。彼は単純に同時タスクの数を制御して、キューがすべてのリソースを食いつぶさないようにする必要があると指摘しました。上記のソリューションは、複数のキューを持つことで簡単に拡張できます。これらのキューを満たすことは彼の責任ですが、このように並行して実行できるタスクの数を制御することは非常に簡単です。 1つは50、もう1つは10など – Josh