我正在使用TPL Dataflow处理图像。我接收到一个处理请求,从流中读取图像,应用多个转换,然后将结果图像写入另一个流:
Request -> Stream -> Image -> Image ... -> Stream
为此,我使用块:
BufferBlock<Request>
TransformBlock<Request,Stream>
TransformBlock<Stream,Image>
TransformBlock<Image,Image>
TransformBlock<Image,Image>
...
writerBlock = new ActionBlock<Image>
问题在于初始的 Request
包含创建结果 Stream
所需的一些数据以及我在那时需要的一些附加信息。我是否必须将原始的 Request
(或其他上下文对象)沿着所有其他块传递到 writerBlock
这样的地方:
TransformBlock<Request,Tuple<Request,Stream>>
TransformBlock<Tuple<Request,Stream>,Tuple<Request,Image>>
TransformBlock<Tuple<Request,Image>,Tuple<Request,Image>>
...
这段文字中提到了一个“丑陋”的问题,那么有没有办法将第一个块链接到最后一个块(或者更一般地说,链接到需要额外数据的块)?
TransformBlock
确实会维护顺序),那么您可以使用类似于附加数据的全局队列。第一个块将其添加到队列中,而最后一个块将从队列中读取它。但我认为这样做会很脆弱。这意味着每个输入在整个管道中必须产生恰好一个输出。 - svick