下游TPL数据流块如何获取源头产生的数据?我正在使用TPL数据流来处理图像。我收到一个处理请求,从流中读取图像,应用几个转换,并将生成的图像写入另一个流:请求->流->图像->图像...->流为此,我使用Blocks:BufferBlockTransformBlockTransformBlockTransformBlockTransformBlock...writerBlock=newActionBlock问题是初始请求包含创建结果流所需的一些数据以及此时我需要的其他一些信息。我是否必须像这样将原始请求(或其他上下文对象)writerBlock写入所有其他块上的writerBlock:TransformBlockTransformBlockTransformBlock...(这是丑),或者有没有办法将第一个块链接到最后一个块(或者,概括为需要额外数据的块)?是的,您几乎需要按照您的描述进行操作,将附加数据从每个块传递到下一个块。但是使用几个辅助方法,您可以使这更容易:}publicstaticIPropagatorBlock,Tuple>CreateExtendedTransform(Functransform){returnnewTransformBlock,Tuple>(tuple=>Tuple.Create(transform(tuple.Item1),tuple.Item2));}签名看起来很吓人,但其实并没有那么糟糕。此外,您可能希望添加将选项传递给创建的块的重载,或采用异步委托的重载。例如,如果您想使用单独的块对数字执行一些操作,同时沿途传递原始数字,您可以这样做:varsource=newBufferBlock();vardivided=CreateExtendedSource(i=>i/2.0);varformatted=CreateExtendedTransform(d=>d.ToString("0.0"));varwriter=newActionBlock>(tuple=>Console.WriteLine(tuple));source.LinkTo(分开);divided.LinkTo(格式化);格式化.LinkTo(writer);for(inti=0;i如您所见,您的lambda表达式(最后一个除外)仅处理“当前”值(int、double或string,具体取决于管道的阶段)、“原始”值(alwaysanint)isautomaticallypassed.在任何时候,您都可以使用使用普通构造函数创建的块(如示例中的最终ActionBlock)来访问这两个值。(BufferBlock实际上不是必需的,但我添加它是为了改进您的设计。)因为我刚刚开始使用TPL数据流,所以我可能做得过头了。但我相信您可以使用BroadcastBlock作为源和您的第一个目标之间的中介来实现这一点。BroadcastBlock可以将消息传送到多个目的地,因此您可以使用它传送到一个目的地,或者您可以使用JoinBlock并最终将结果与原始消息合并。来源->广播->-------------------------------------------->JoinBlock->Transformation1->Transformation'n'->例如:varsource=newBufferBlock();vartransformation=newTransformBlock(i=>i*100);varbroadcast=newBroadcastBlock(null);source.LinkTo(广播);broadCast.LinkTo(转换);varjb=newJoinBlock();broadCast.LinkTo(jb.Target1);transformation.LinkTo(jb.Target2);jb.LinkTo(newActionBlock>(c=>Console.WriteLine("Source:{0},TargetResult:{1}",c.Item1,c.Item2)));来源.帖子(1);来源.帖子(2);来源.完成();收益率...来源:1,目标结果:100来源:2,目标结果:200我不太确定它在异步环境中的行为方式。以上就是C#学习教程:下游TPL数据流块如何获取源头产生的数据?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: