鉴于此代码:
s_Batch = new BatchBlock<PerformanceRecord>(500);
s_Action = new ActionBlock<PerformanceRecord[]>(a => SendToDatabase(a));
s_Batch.LinkTo(s_Action);
当我完成后,我需要在每个块上调用Complete()
吗?或者完成s_Batch
是否会触发链接到它的块中的完整内容?
答案 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();
缺点是您需要为每个链接的块重复此模式,这样您最终会重复自己。