次の場合:
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。どうすればそれについて行くことができますか?sourceBlockANDの完了ステータスを照会してInputCount、のtargetBlockがゼロであることを確認したいものを取得する唯一の方法はありますか?これが非常に安定しているかどうかはわかりません(の最後のアイテムがに渡されたsourceBlock場合にのみ、本当に完了とマークされますsourceBlocktargetBlock?)。同じ目標を達成するためのよりエレガントで効率的な方法はありますか?
sourceBlock編集: ANDがゼロInputCountであることの完了をチェックする「汚い」方法でさえ、実装するのは簡単ではないことに気づきました。targetBlockそのブロックはどこにありますか?targetBlock上記の2つの条件が満たされると、メッセージは明らかに処理されなくなるため、内に含めることはできませtargetBlockん。また、導入の完了状況を確認するとsourceBlock、多くの非効率性が生じます。