完成TPL数据流链

时间:2014-11-07 06:06:58

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

鉴于此代码:

s_Batch = new BatchBlock<PerformanceRecord>(500);
s_Action = new ActionBlock<PerformanceRecord[]>(a => SendToDatabase(a));
s_Batch.LinkTo(s_Action);

当我完成后,我需要在每个块上调用Complete()吗?或者完成s_Batch是否会触发链接到它的块中的完整内容?

2 个答案:

答案 0 :(得分:5)

正如您的代码现在所示,您需要分别在所有块上调用Complete

s_Batch.Complete();
await s_Batch.Completion;

s_Action.Complete();
await s_Action.Completion;

然而,在链接块以请求完成传播时,您可以使用DataflowLinkOptions

s_Batch.LinkTo(s_Action, new DataflowLinkOptions {PropagateCompletion = true});
s_Batch.Complete();
await s_Batch.Completion;

这会将完成和错误通知传播到链接的目标块(即s_Action)。

答案 1 :(得分:1)

我真的很喜欢l3arnon的答案,因为它是最简洁的。

这是我用TPL块完成/看到的其他功能。

s_Batch.Completion.ContinueWith( t => 
    { 
        if(t.IsFaulted) 
            ((IDataFlowBlock)s_Action).Fault(t.Exception);
        else
            s_Action.Complete();
    });
s_Batch.Complete();
s_Action.Completion.Wait();

缺点是您需要为每个链接的块重复此模式,这样您最终会重复自己。