我有一些块,最终从TransformBlock转换为基于LinkTo谓词的三个其他变换块之一。我使用DataflowLinkOptions来传播完成状态。问题是当谓词满足并且该块启动时,我的管道的其余部分继续执行。看起来管道应该先等待此块完成。
这段代码大致如下:
var linkOptions = new DataflowLinkOptions {PropagateCompletion = true};
mainBlock.LinkTo(block1, linkOptions, x => x.Status = Status.Complete);
mainBlock.LinkTo(block2, linkOptions, x => x.Status = Status.Cancelled);
mainBlock.LinkTo(block3, linkOptions, x => x.Status = Status.Delayed);
mainBlock.LinkTo(DataflowBlock.NullTarget<Thing>(), linkOptions);
现在,这个方法没有按照我的预期工作,因此我发现得到我想要的行为的唯一方法是将 linkOptions 拿出来,并将以下内容添加到 mainBlock 的 Lambda 中。
mainBlock = new TransformBlock<Thing,Thing>(input =>
{
DoMyStuff(input);
if (input.Status = Status.Complete)
{
mainBlock.Completion.ContinueWith(t => block1.Complete());
}
if (input.Status = Status.Cancelled)
{
mainBlock.Completion.ContinueWith(t => block2.Complete());
}
if (input.Status = Status.Delayed)
{
mainBlock.Completion.ContinueWith(t => block3.Complete());
}
return input;
});
那么问题来了,这是唯一使它工作的方法吗?
顺便说一句,我已经通过单个数据项在我的单元测试中运行它以尝试调试管道行为。每个块已经用多个单元测试分别进行了测试。在我的管道单元测试中,断言在块完成执行之前就被击中了,因此失败了。
如果我删除块2和块3的链接,并使用linkOptions调试测试,它可以正常工作。