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

Is there a Dataflow TransformBlock that receives two input arguments?

我有一个代表接受两个数字并从中创建一个 System.Windows.Point:

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

我想了解如何使用 TPL 数据流(特别是 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?

更新:

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

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

对于将两个整数组合为一个点的简单示例:

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 到达输入缓冲区的顺序不正确,则需要注意重新同步它们。 join 块只会合并它收到的第一个 X 和第一个 Y 值,依此类推。