【发布时间】:2021-12-28 09:49:21
【问题描述】:
考虑以下管道:
public static void Main()
{
var firstBlock = new TransformBlock<string, string>(s =>
{
Console.WriteLine("FirstBlock");
return s + "-FirstBlock";
});
var batchBlock = new BatchBlock<string>(100, new GroupingDataflowBlockOptions { Greedy = true });
var afterBatchBlock = new TransformManyBlock<string[], string>(strings =>
{
Console.WriteLine("AfterBatchBlock");
return new[] { strings[0] + "-AfterBatchBlock" };
});
var lastBlock = new ActionBlock<string>(s =>
{
Console.WriteLine($"LastBlock {s}");
});
firstBlock.LinkTo(batchBlock, new DataflowLinkOptions { PropagateCompletion = true }, x => x.Contains("0"));
batchBlock.LinkTo(afterBatchBlock, new DataflowLinkOptions { PropagateCompletion = true });
afterBatchBlock.LinkTo(lastBlock, new DataflowLinkOptions { PropagateCompletion = true });
firstBlock.LinkTo(lastBlock, new DataflowLinkOptions { PropagateCompletion = true });
firstBlock.Post("0");
firstBlock.Complete();
firstBlock.Completion.GetAwaiter().GetResult();
batchBlock.Completion.GetAwaiter().GetResult();
afterBatchBlock.Completion.GetAwaiter().GetResult();
lastBlock.Completion.GetAwaiter().GetResult();
}
运行此代码会被以下输出阻止:
第一块
AfterBatchBlock
我认为幕后发生的事情如下:
- FirstBlock 向其所有链接目标(BatchBlock、AfterBatchBlock、LastBlock)发送完成信号
- BatchBlock 和 LastBlock 完成
- AfterBatchBlock 然后尝试将其输出传递给 LastBlock,但它已经完成并且永远卡住了。
我的问题是:
- 这是一个错误吗?
- 假设它是设计使然,克服我的管道达到的不良状态的推荐方法是什么
【问题讨论】:
标签: c# task-parallel-library tpl-dataflow