我使用TPL数据流创建了一个输入元素的缓冲块,这些元素由TransformBlock进行处理,并输出到一个输出缓冲块。
有没有一种惯用的方法来路由失败的元素?
当InputPacket元素完成处理时,与processQueue关联的操作将返回一个OutputPacket,该输出将被路由到outputQueue。
如果与processQueue关联的操作调用不可靠的Web服务,则某些InputPacket元素的处理将超时,并且我想重试这些元素x次。但我不想立即尝试它们,我想将它们放回输入队列。
我希望能够将超时的InputPacket元素路由回inputQueue,直到它们失败了x次,然后路由到failureQueue:
inputQueue = new BufferBlock<InputPacket>;
processQueue = new TransformBlock <InputPacket, OutputPacket>;
outputQueue = new BufferBlock<OutputPacket>;
inputQueue.LinkTo(processQueue, new DataflowLinkOptions { PropagateCompletion = true });
processQueue.LinkTo(outputQueue, new DataflowLinkOptions { PropagateCompletion = true });
有没有一种惯用的方法来路由失败的元素?
当InputPacket元素完成处理时,与processQueue关联的操作将返回一个OutputPacket,该输出将被路由到outputQueue。
如果与processQueue关联的操作调用不可靠的Web服务,则某些InputPacket元素的处理将超时,并且我想重试这些元素x次。但我不想立即尝试它们,我想将它们放回输入队列。
我希望能够将超时的InputPacket元素路由回inputQueue,直到它们失败了x次,然后路由到failureQueue:
BufferBlock<CallPacket> failureQueue = new BufferBlock<InputPacket>;
使用LinkTo
谓词的复杂性在于涉及到两种不同的类型:
InputPacket OutputPacket
看起来我可以通过更改以下内容来处理这个问题:
processQueue = new TransformBlock <InputPacket, ParentPacketType>;
接着基于数据包类型编写谓词。
或者
通过将输出存储在InputPacket
的成员变量中的方式存储在inputElement
中,但两种方式似乎都不是一个好的实现方法。