2012-12-19 11 views
6

誰もそのキューをブロックすることができず、キュー内のアイテムを何らかの順序で処理する必要があるアイテムのキューを処理する必要があることがよくあります。私は頻繁にこれを行うクラスを書くが、いくつかの一般的なバージョンがあるはずだと思ったが、見つけられない。一般的なC#ラウンドロビン(パーティション/ソート)キュー

私はタイプを指定することができるキュークラスを探しています。パーティションのセレクタとキューにオブジェクトを追加できるように並べ替えるセレクタを探しています。私の注文指定子で注文された次のパーティションの最初のオブジェクト。

例えば、私はパーティション分割する方法とキューをソートする方法を指定する次のように呼び出します。

var queue = new RoundRobinQueue<Message>(
      _ => _.UserID, 
      _ => _.SendDate 
      ); 

そして、私は、メッセージのの多くを追加した後、私は私のキューやプロセスにアイテムをParallel.ForEachすることができます最も早い順にSendDateの順で次のUserになります。こうすることで、あるユーザーが遅い場合、アイテムは1つのスレッドしか取得できないため、アイテムはキューをブロックしませんが、ユーザーが1人だけの場合、彼はすべてのスレッドを取得するため、彼は唯一のパーティションです。

私はすべてを見渡しましたが、このために汎用の実装をC#で見つけることができませんでした。何か案は?

+0

foreachにはIEnumerableが必要です。しかし、このコレクション、ラウンドロビンキューが常に次のものを持つ場合、どのように終了するべきかをforeachがどのように知ることができますか?いくつかのカウントまたはタイムアウトによってそれを壊すよう強制することができます。しかし、このクラスのユーザーは、自分が間違って使用しても傷つく可能性があります。例えば。このキューはコード内でIEnumerableとして渡され、IEnumerableを受け取り、foreachを実行する1つのメソッドに渡されます。 – Ryan

+0

Iteratorを返す 'IEnumerable'への拡張メソッドはなぜありませんか? – PPC

答えて

-1

System.Collections.Concurrentで定義されたクラスを見てください。一般的なConcurrentQueueだけでなく、プロデューサ - コンシューマパターンのためのより基本的なビルディングブロックもあります。

使用可能なクラスとインターフェイスは、MSDNに要約されています。