如何在JoinBlock之后完成一个区块

时间:2018-07-19 07:59:38

标签: c# tpl-dataflow

我在下面的senario中使用TPL执行数据流。 ab是连接在一起的某些数据源,然后通过数据流。

var a = new TransformBlock<object, int>(_ => 1);
var b = new TransformBlock<object, int>(_ => 2);

var join = new JoinBlock<int, int>(new GroupingDataflowBlockOptions { Greedy = false });

var transform = new TransformBlock<Tuple<int, int>, int>(uri =>
{
    Console.WriteLine("Handling '{0}'...", uri);
    return uri.Item1;
});

var printReversedWords = new ActionBlock<int>(ddd => Console.WriteLine(ddd));

var linkOptions = new DataflowLinkOptions { PropagateCompletion = true };

a.LinkTo(join.Target1);
b.LinkTo(join.Target2);
join.LinkTo(transform);
transform.LinkTo(printReversedWords, linkOptions);

a.Post(1);
b.Post(1);
Task.WhenAll(a.Completion, b.Completion).ContinueWith(_ => join.Complete());
printReversedWords.Completion.Wait();

所有这些之后,我可以在控制台中看到如下日志:

  

处理'<1,2>'...

     

1

这意味着ActionBlock printReversedWords已被处理。但是,它仍在等待最后一行,永远不会结束。

谁能告诉我该更新什么?

1 个答案:

答案 0 :(得分:0)

要完成管道,您需要在链中的第一个块上调用Blade::component('components.PageNav'); // "/views/components/PageNav.php" 。在您的情况下,您需要确保在两个块CompleteComplete()上都调用了a。并且您需要从b

传播完成

此外,最好是使方法JoinBlock.Wait()完成,而不是阻塞调用async

在配置延续时,请确保通过故障下游块An example is here处理异常和成功完成。

await