当使用谓词时,TPL数据流永远不会完成

4
我有一个TPL Dataflow,当使用谓词来过滤从TransformBlock传递到ActionBlock的项时,它永远不会完成。
如果谓词对任何项返回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
1个回答

9

getBlock没有完成,因为它接收到的项目没有任何地方可以去。如果您有一个谓词,请添加一个空目标,以便不匹配的任何项目都有一个离开管道的地方。

getBlock.LinkTo(writeBlock, new DataflowLinkOptions
{
    PropagateCompletion = true
}, i => i == 12)
getBlock.LinkTo(DataflowBlock.NullTarget<int>());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接