c# - DataflowBlock.Complete() 据说会阻止 block 产生更多消息,排队的项目会发生什么?

标签 c# .net task-parallel-library tpl-dataflow

.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/

相关文章:

c# - 保留前 (N) 个值的固定大小集合

c# - 将 ILMerge 与 log4net 一起使用会导致 "inaccessible due to protection level"错误

c# - 如何使用 C# 设置事件(即前台)Word 文档

c# - 被 "The remote server returned an error: (403) Forbidden"与 https 中的 WCF 服务难住了

c# - 我们应该在调用异步回调的库中使用 ConfigureAwait(false) 吗?

c# - 一个新的随机初始化向量在加密过程中总是产生相同的密文

c# - 如何获取和设置 WPF 文本框的当前光标位置

c# - 使用 lambda 表达式与私有(private)方法

asp.net-mvc - MVC4 异步和并行执行

.net - 为什么垃圾收集器不收集任务对象