我使用谓词过滤从TransformBlock传递给ActionBlock的项目时,从未完成以下TPL数据流。
如果谓词对任何项返回false,则数据流将挂起。
有人可以提供一些有关正在发生的事情以及如何解决这个问题的见解吗?
// define blocks
var getBlock = new TransformBlock<int, int>(i =>
{
Console.WriteLine($"getBlock: {i}");
return ++i;
});
var writeBlock = new ActionBlock<int>(i =>
{
Console.WriteLine($"writeBlock: {i}");
});
// link blocks
getBlock.LinkTo(writeBlock, new DataflowLinkOptions
{
PropagateCompletion = true
}, i => i == 12); // <-- this predicate prevents the completion of writeBlock
// push to block
var items = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
foreach (var i in items)
{
getBlock.Post(i);
}
// wait for all operations to complete
getBlock.Complete();
await writeBlock.Completion; // <-- application hangs here
答案 0 :(得分:2)
getBlock
未完成,因为发布到它的项目无处可去。如果你有一个谓词添加一个空目标,那么任何不匹配的项目都有一个退出管道的地方。
getBlock.LinkTo(writeBlock, new DataflowLinkOptions
{
PropagateCompletion = true
}, i => i == 12)
getBlock.LinkTo(DataflowBlock.NullTarget<int>());