次の場合:
BufferBlock<int> sourceBlock = new BufferBlock<int>();
TransformBlock<int, int> targetBlock = new TransformBlock<int, int>(element =>
{
return element * 2;
});
sourceBlock.LinkTo(targetBlock, new DataflowLinkOptions { PropagateCompletion = true });
//feed some elements into the buffer block
for(int i = 1; i <= 1000000; i++)
{
sourceBlock.SendAsync(i);
}
sourceBlock.Complete();
targetBlock.Completion.ContinueWith(_ =>
{
//notify completion of the target block
});
はtargetBlock
完了していないようです。その理由は、を他のDataflowブロックにTransformBlock
targetBlock
リンクしていないため、のすべてのアイテムが出力キューで待機しているためだと思います。targetBlock
しかし、私が実際に達成したいのは、(A)targetBlock
完了が通知され、(B)入力キューが空になったときの通知です。アイテムがまだの出力キューにあるかどうかは気にしたくありませんTransformBlock
。どうすればそれについて行くことができますか?sourceBlock
ANDの完了ステータスを照会してInputCount
、のtargetBlock
がゼロであることを確認したいものを取得する唯一の方法はありますか?これが非常に安定しているかどうかはわかりません(の最後のアイテムがに渡されたsourceBlock
場合にのみ、本当に完了とマークされますsourceBlock
targetBlock
?)。同じ目標を達成するためのよりエレガントで効率的な方法はありますか?
sourceBlock
編集: ANDがゼロInputCount
であることの完了をチェックする「汚い」方法でさえ、実装するのは簡単ではないことに気づきました。targetBlock
そのブロックはどこにありますか?targetBlock
上記の2つの条件が満たされると、メッセージは明らかに処理されなくなるため、内に含めることはできませtargetBlock
ん。また、導入の完了状況を確認するとsourceBlock
、多くの非効率性が生じます。