是否有一个Dataflow TransformBlock接收两个输入参数?

时间:2017-01-05 16:20:48

标签: task-parallel-library tpl-dataflow

我有一个委托,它接受两个数字并从中创建System.Windows.Point

(x, y) => new Point(x,y);

我想学习如何使用TPL Dataflow,特别是TransformBlock来执行此操作。

我会有这样的事情:

ISourceBlock<double> Xsource;
ISourceBlock<double> Ysource;

ITargetBlock<Point> PointTarget;

// is there such a thing?
TransformBlock<double, double, Point> PointCreatorBlock;

// and also, how should I wire them together?

更新:

另外,我如何组装一个连接两个以上参数的网络?例如,假设我有一个接收八个参数的方法,每个参数来自不同的缓冲区,我如何创建一个块,知道每个参数何时有一个实例可用,以便可以创建对象? / p>

1 个答案:

答案 0 :(得分:2)

我认为你要找的是连接块。目前有两个输入和三个输入变体,每个都输出一个元组。这些可以组合以创建八参数结果。另一种方法是创建一个类来保存参数并使用各种块来处理和构造参数类。

对于一个点合并两个整数的简单示例:

class MyClass {

    BufferBlock<int> Xsource;
    BufferBlock<int> Ysource;
    JoinBlock<int, int> pointValueSource;
    TransformBlock<Tuple<int, int>, Point> pointProducer;

    public MyClass() {
        CreatePipeline();
        LinkPipeline();
    }

    private void CreatePipeline() {
        Xsource = new BufferBlock<int>();

        Ysource = new BufferBlock<int>();

        pointValueSource = new JoinBlock<int, int>(new GroupingDataflowBlockOptions() {
            Greedy = false
        });

        pointProducer = new TransformBlock<Tuple<int, int>, Point>((Func<Tuple<int,int>,Point>)ProducePoint, 
            new ExecutionDataflowBlockOptions()
            { MaxDegreeOfParallelism = Environment.ProcessorCount });
    }

    private void LinkPipeline() {
        Xsource.LinkTo(pointValueSource.Target1, new DataflowLinkOptions() {
            PropagateCompletion = true
        });

        Ysource.LinkTo(pointValueSource.Target2, new DataflowLinkOptions() {
            PropagateCompletion = true
        });

        pointValueSource.LinkTo(pointProducer, new DataflowLinkOptions() {
            PropagateCompletion = true
        });

        //pointProduce.LinkTo(Next Step In processing)
    }

    private Point ProducePoint(Tuple<int, int> XandY) {
        return new Point(XandY.Item1, XandY.Item2);
    }
}

JoinBlock将一直等到它的两个输入缓冲区都有数据可用来产生输出。另请注意,在这种情况下,如果X和Y在输入缓冲区中无序到达,则需要注意重新同步它们。连接块仅组合它接收的第一个X和第一个Y值,依此类推。