【问题标题】:Linked DataFlow block completion is not working链接数据流块完成不起作用
【发布时间】:2017-08-12 02:43:08
【问题描述】:

我有一个链接到ActionBlockBroadcastBlock。当我在BroadcastBlockActionBlock 上依次调用“完成”时,它不起作用。而仅在 BroadCastBlock 上调用“完成”就可以了。

public class ActionTester
{
    private readonly ActionBlock<int> _action;
    private readonly BroadcastBlock<int> _input;

    public ActionTester()
    {
        _input = new BroadcastBlock<int>(null);
        _action = new ActionBlock<int>(i => Process(i));

        _input.LinkTo(_action, new DataflowLinkOptions { PropagateCompletion = true });
    }

    public void Post(int i) => _input.Post(i);

    public async Task Process(int i)
    {
        await Task.Delay(2000);
        Console.WriteLine(i);
    }

    public void Complete()
    {
        _input.Complete();
        _action.Complete(); // When this is removed, program is working as expected
    }

    public Task Completion => _action.Completion;
}

测试代码是

static void Main(string[] args)
{
    var actor = new ActionTester();

    actor.Post(5);
    actor.Post(7);

    actor.Complete();
    actor.Completion.Wait();

    Console.WriteLine("Finished");
    Console.Read();
}

_action.Complete() 存在时(注释行),代码将移过actor.Completion.wait() 并显示“已完成”。如果我删除_aciton.Complete(),则发布的值会正确显示,然后写入“完成”。

当数据流块被链接时,我们应该只调用根块的“完成”吗?将PropagateCompletion 设置为 true/false 无效。

解决方案

通过等待根块完成来解决

public void Complete()
{
    _input.Complete();
    _input.Completion.Wait();
    _action.Complete(); 
}

【问题讨论】:

    标签: c# tpl-dataflow


    【解决方案1】:

    当数据流块被链接时,我们应该只调用根块的“完成”吗?

    是的,这正是你应该做的。

    如果您确实传播了Completion,那么您确实不需要需要自己完成_actionBlock - 它会在处理完缓冲区中的所有项目后完成。完成操作块后,它不会接受任何新消息,因此所描述的行为是预期的且有效的。

    【讨论】:

    • 当“PropogateCompletion”设置为false时,我们不应该在所有链接块上调用完成吗?在我的示例中,即使我将 PropagateCompletion 设置为 false,如果我在链接块上再次调用完成,它也不起作用。
    • 如果你完成了第二个块之前所有的消息都从第一个发送到第二个,第二个将丢弃所有的消息。所以,如果不传播补全,需要自己处理。
    猜你喜欢
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    相关资源
    最近更新 更多