DataflowBlock.Complete() 应该会阻止该块生成更多消息,排队的项目会怎样?

DataflowBlock.Complete() supposedly stops the block from producing more messages, what happens to the queued items?

.Complete() 的文档说明如下:

Signals to the IDataflowBlock that it should not accept nor produce any more messages nor consume any more postponed messages.

所以假设我有一个 BatchedJoinBlock 我想在它的源块完成时完成,但我无法传播,因为链接在谓词上:

block1.LinkTo(block2.Target1, predicate);
block1.LinkTo(block2.Target2, !predicate);

await block1.Completion;
block2.Complete();

因此根据最后一行将停止 block2 生成新消息的文档,但问题是 block1block2 接受了所有消息后立即完成,但是这些接受的消息可能还没有被处理,所以如果 block2 不能生成新消息,它们会怎样?

也许我误解了再生成消息

Complete 意味着该块将停止接受更多消息,但它 处理其 InputQueue 中的消息,即使这将导致发送消息在管道中转发(与块因异常而出错时相反)。

你可以通过这个简单的例子看到:

var transformBlock = new TransformBlock<int, int>(async _ =>
{
    await Task.Delay(100);
    return _;
});

var actionBlock = new ActionBlock<int>(_ => Console.WriteLine(_));
transformBlock.LinkTo(actionBlock);

for (int i = 0; i < 1000; i++)
{
    await transformBlock.SendAsync(i);
}

transformBlock.Complete();
Console.WriteLine("complete");
await transformBlock.Completion;
Console.WriteLine("completed");

complete 将立即写入,但 TransformBlock 将继续处理消息并将它们缓慢移动到下一个 ActionBlock


我也不完全确定 "produce anymore messages" 到底是什么意思。我假设它与生成消息的块有关,而不是与处理传入消息的块有关,尽管我想不出一个。