【问题标题】:Completing a TPL dataflow chain完成 TPL 数据流链
【发布时间】:2014-11-08 00:43:07
【问题描述】:

鉴于此代码:

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

完成后,我需要在每个块上调用Complete() 吗?或者完成s_Batch 会触发与其链接的块中的完成?

【问题讨论】:

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


【解决方案1】:

按照您现在的代码,您需要在所有块上分别调用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)。

【讨论】:

    【解决方案2】:

    我实际上喜欢 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();
    

    缺点是您需要为每个链接块重复此模式,因此您最终会重复很多次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多