1

我从 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 中的存储文件时,没有退回物品。

4

1 回答 1

5

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

您可以在链接时设置一个PropagateCompletion选项,该选项将传播完成。

readFilesBlock.LinkTo(storeFilesInBagAction, new DataflowLinkOptions
{
    PropagateCompletion = true,
});
于 2013-12-11T18:40:00.943 回答