2017-11-23 15 views
0

次のTPLデータフローは、述語を使用して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 

答えて

2

getBlockは投稿されたアイテムがどこにも行き渡らないため完了しません。述部がある場合、一致しない項目がパイプラインを終了する場所を持つように、ヌル・ターゲットを追加します。

getBlock.LinkTo(writeBlock, new DataflowLinkOptions 
{ 
    PropagateCompletion = true 
}, i => i == 12) 
getBlock.LinkTo(DataflowBlock.NullTarget<int>()); 
関連する問題