【发布时间】:2014-09-07 03:03:35
【问题描述】:
我有一些块最终从一个 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;
});
所以问题是,这是让它工作的唯一方法吗?
顺便说一句,这已在我的单元测试中运行,其中运行了一个数据项以尝试调试管道行为。每个块都已通过多个单元测试单独测试。所以在我的流水线单元测试中发生的是断言在块完成执行之前被命中,因此失败。
如果我删除 block2 和 block3 链接并使用 linkOptions 调试测试,它可以正常工作。
【问题讨论】:
-
你能发布重现问题的真实代码吗?你的“这样的东西”甚至不会编译。
-
TPL 数据流,如果用于基于角色的编程。看来您正在尝试使用它,而不是仅使用 if 语句编写异步方法。
-
嗯,这只是给我带来麻烦的管道的一部分。但是,在尝试提出一个我可以发布的完整测试示例时,我发现我遇到的问题与在我的块中使用异步委托更相关。我会在进行更多调查后发布更多信息。
标签: c# unit-testing task-parallel-library