TPL 数据流块永远不会在 PropagateCompletion 上完成

Lui*_*rao 5 .net c# dataflow task-parallel-library tpl-dataflow

自从对我的传播完成管道进行了最后一次更改后,我的一个缓冲区块从未完成。让我总结一下什么是有效的,什么不再是:

以前工作:

A.LinkTo(B, PropagateCompletion);
B.LinkTo(C, PropagateCompletion);
C.LinkTo(D, PropagateCompletion);
D.Receive();

// everything completes
Run Code Online (Sandbox Code Playgroud)

不再工作:

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
Run Code Online (Sandbox Code Playgroud)

如果我取消注释注释行,一切正常,但显然该行不是必需的。

不知何故,我的 BufferBlock B 永远不会完成,即使链接它的块已完成并传播其完成,并且它链接的块接收所有缓冲项。

Jam*_*cas 2

通过等待 A 的完成,在 A 完成之前不会执行任何剩余代码。这就是await 的工作原理——代码被包装在一个延续中,准备完成等待的代码。因此,在这种情况下,B 在 A 完成后链接到 A,因此我认为完成不会传播。