3

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

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()
    {

    }
}

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

4

4 に答える 4

1

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

于 2011-01-06T16:13:38.780 に答える
1

パイプラインがどのように機能するのかは明確ではありません。なぜ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を生成する可能性があります。これは、Taskを使用して、またはより単純に並列foreachループを使用して実行できます。

あるいは、TPLのTask.ContinueWith方法を使用して、タスクを入力から出力にチェーンすることもできます。

于 2011-01-06T16:35:35.963 に答える
1

Microsoftには、まさにこのようなものがあります。TPLDataflowを使用すると、パイプラインでブロックを定義し、それらのバッファリングと並列化の方法をきめ細かく制御できます。

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

于 2013-11-11T16:31:36.980 に答える
0

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

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

于 2013-11-11T16:20:20.573 に答える