【问题标题】: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();
缺点是您需要为每个链接块重复此模式,因此您最终会重复很多次。