链接块无法完成

时间:2013-12-11 18:03:09

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

我从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的商店文件时,没有退回商品。

1 个答案:

答案 0 :(得分:5)

默认情况下,数据流块不会传播完成。这是设计的;数据流可以表示任何类型的网格,包括拆分,连接和循环(不仅仅是管道)。

链接时可以设置PropagateCompletion option来传播完成。

readFilesBlock.LinkTo(storeFilesInBagAction, new DataflowLinkOptions
{
    PropagateCompletion = true,
});