2011-01-06 13 views
3

C#で並列パイプラインを作成したいと思います。私はIOperationという名前のインターフェイスを宣言しました:C#の並列パイプライン

public interface IOperation<Tin, Tout> 
{ 
    BlockingCollection<Tout> BlockingCollection(IEnumerable<Tin> input); 
} 

ここでは、これらの操作の複数を並列に実行するクラスを記述したいと思います。 私はこれでバガン:

public class Pipeline : IPipeline 
{ 
    private List<IOperation<Object, Object>> operations = new List<IOperation<Object, Object>>(); 
    private List<BlockingCollection<Object>> buffers = new List<BlockingCollection<Object>>(); 
    public void Register(IOperation<Object, Object> operation) 
    { 
     operations.Add(operation); 
    } 

    public void Execute() 
    { 

    } 
} 

しかし、彼らはすべて異なるジェネリック型を持っているので、私は、操作と操作の間にバッファを保存するための任意の解決策を見つけることができません。誰にもアイデアはありますか?

+1

"保存"という意味を明確にすることはできますか? –

+0

Pipelineクラスの先頭にある2つのリストにそれらを入れたい – AntonS

答えて

1

TPLからParallel.ForEachを使用したことはありますか?
タスク並列ライブラリ(TPL)は、.NET 4のパブリックタイプとAPIのセットです。

+0

リストに何も追加されていない場合、新しい入力を待つforeachループを作成できますか? – AntonS

+1

そうだと思います。リストを使用する代わりに、IEnumerable を返すメソッドを使用します。その方法では、データが利用可能であれば、データを '返す'、そうでなければ同期信号(例えば、モニタがパルス化される)を待つ。 – ZunTzu

1

Pipelineがどのように機能するのかはあまり明確ではありません。なぜあなたはBlockingCollectionsを回っていますか?なぜジェネリックスを使用していますが、タイプとしてobjectを入れていますか?

代わりに、タイプActionの削除をロードするパイプラインを使用し、タスク並列ライブラリを使用して、それらのアクションを並行して実行するタスクを作成することを検討してください。

public void Register(Action operation) 
    { 
     operations.Add(operation); 
    } 

public void Execute() 
    { 
     foreach (var action in operations) 
      Task.StartNew(operation); 
    } 

しかし、実際には「パイプライン」ではありませんが、それは並行して実行される操作の束です。

パイプラインには通常、入力タイプと出力タイプのパイプラインステップがあります。 PipelineStep<T,U>のようなものを作成することでこれを処理でき、Func操作で渡す各パイプラインステップを構築できます。内部的には、各パイプラインステップは入力IEnumerableを消費し、出力IEnumerableを生成する可能性があり、タスクを使用してこれを行うことも、より簡単に並列foreachループを使用して実行することもできます。

また、TPLのTask.ContinueWithメソッドを使用して、タスクを入力から出力に連鎖させることもできます。

0

BlockingCollectionを使用する並列パイプラインについては、http://msdn.microsoft.com/en-us/library/ff963548.aspxに記事があります。

基本的には、各ステップにはBlockingCollection型の出力キューが必要です。前のステップの出力キューからアイテムを取り込み、処理が完了したらその出力に追加します。

1

マイクロソフトでは、まさにこのようなものがあります。TPL Dataflowは、パイプラインでブロックを定義し、バッファリングと並列化の方法をきめ細かく制御できます。

ソリューションとは異なり、完全非同期プッシュデザインを使用します。 BlockingCollection(ブロッキングプルデザイン)は使用されていないため、パイプラインが深い場合は大幅に高速になります。