我从TPL DataFlow开始。 我创建了以下工作代码。 readFilesBlock是 BufferBlock 它像这样填充:
public async void ReadItems(ITargetBlock<SourceCodeFile> target)
{
foreach(var item in Source)
{
await target.SendAsync(item); //when To use post instead of sendasync?
}
}
target.Complete();
现在我按照这个
计算BufferBlock(readFilesBlock)while (await readFilesBlock.OutputAvailableAsync())
{
var file = await readFilesBlock.ReceiveAsync();
ActionBlock<SourceCodeFile> action = new ActionBlock<SourceCodeFile>(item => storeResultsInBag(resultBag, item));
await action.SendAsync(file);
}
这个工作正常。 现在我想使用链接功能
我试过了:
var storeFilesInBagAction = new ActionBlock<SourceCodeFile>(item => storeResultsInBag(resultBag, item));
readFilesBlock.LinkTo(storeFilesInBagAction);
await storeFilesInBagAction.Completion;
但这次我永远不会完成。
我做错了什么?
当我没有等待Bagaction的商店文件时,没有退回商品。
答案 0 :(得分:5)
默认情况下,数据流块不会传播完成。这是设计的;数据流可以表示任何类型的网格,包括拆分,连接和循环(不仅仅是管道)。
链接时可以设置PropagateCompletion
option来传播完成。
readFilesBlock.LinkTo(storeFilesInBagAction, new DataflowLinkOptions
{
PropagateCompletion = true,
});