.Complete()
的文档说明如下:
Signals to the
IDataflowBlock
that it should not accept nor produce any more messages nor consume any more postponed messages.
假设我有一个 BatchedJoinBlock
,我想在其源 block 完成时完成它,但我无法传播,因为链接位于谓词上:
block1.LinkTo(block2.Target1, predicate);
block1.LinkTo(block2.Target2, !predicate);
await block1.Completion;
block2.Complete();
因此根据文档,最后一行将阻止 block2
生成新消息,但问题是 block1
一旦 block2
完成> 已接受其所有消息,但这些接受的消息可能尚未处理,那么如果 block2
无法生成新消息,它们会发生什么情况?
也许我误解了产生更多消息?
最佳答案
Complete
意味着该 block 将停止接受更多消息,但它将处理其 InputQueue
中的消息,即使这会导致在管道中向前发送消息(而不是由于异常而导致 block 出现故障)。
您可以通过这个简单的示例看到这一点:
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
。
我也不完全确定“产生更多消息”的实际含义。我假设它与生成消息的 block 有关,而不是与处理传入消息的 block 有关,尽管我想不出一个。
关于c# - DataflowBlock.Complete() 据说会阻止 block 产生更多消息,排队的项目会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31142065/