【发布时间】:2015-09-05 07:10:34
【问题描述】:
自从上次更改我的传播完成管道以来,我的一个缓冲区块永远不会完成。让我总结一下什么有效,什么不再有效:
以前的工作:
A.LinkTo(B, PropagateCompletion);
B.LinkTo(C, PropagateCompletion);
C.LinkTo(D, PropagateCompletion);
D.Receive();
// everything completes
不再工作:
A.LinkTo(B, PropagateCompletion);
C.LinkTo(D, PropagateCompletion);
await A.Completion;
someWriteOnceBlock.Post(B.Count);
// B.Complete(); commented on purpose
B.LinkTo(C, PropagateCompletion);
D.Receive();
// Only A reaches completion
// B remains in 'waiting for activation'
// C executes but obviously never completes since B doesn't either
如果我取消注释注释行,一切正常,但显然该行不应该是必需的。
不知何故,我的 BufferBlock B 永远不会完成,即使链接 to 的块已完成并传播其完成,并且链接的块 from 它接收所有缓冲项.
【问题讨论】:
-
你应该显示你的实际代码。
-
@i3arnon 我不能放整个代码,因为管道非常复杂,清理它以保留相关部分需要很长时间,但更重要的是,我管道中的所有内容都是很标准,我所有的积木都是链接的,一件事进去,一件事出来。 await 周围的那些行是唯一不寻常的事情,它们正是我拥有它们的方式,我相信在我完美工作的管道的其余部分中没有任何内容可以解释取消注释注释行使其工作,并且注释它会阻止 B永远完成。
-
你最后有运气吗?a
标签: c# .net task-parallel-library dataflow tpl-dataflow