链接的DataFlow块完成无效

时间:2017-08-09 22:09:03

标签: c# tpl-dataflow

我有BroadcastBlockActionBlock相关联。当我打电话给#34;完成"顺序在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()和&#34;已完成&#34;正在显示。如果我删除_aciton.Complete(),则会正确显示发布的值,然后&#34;已完成&#34;是写的。

当链接数据流块时,我们应该调用&#34;完成&#34;只有根块?将PropagateCompletion设置为true / false无效。

解决方案

等待根块完成解决

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

1 个答案:

答案 0 :(得分:2)

  

当链接数据流块时,我们应该调用&#34;完成&#34;只有根块?

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

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