ActionBlock
にリンクされたBroadcastBlock
があります。 BroadcastBlock
とActionBlock
の両方で「完了」と呼ぶと、それは機能しません。ちょうどBroadCastBlock
で「完全」と呼んでいるのは機能しています。リンクされたDataFlowブロックの完了が機能していません
public class ActionTester
{
private readonly ActionBlock<int> _action;
private readonly BroadcastBlock<int> _input;
public ActionTester()
{
_input = new BroadcastBlock<int>(null);
_action = new ActionBlock<int>(i => Process(i));
_input.LinkTo(_action, new DataflowLinkOptions { PropagateCompletion = true });
}
public void Post(int i) => _input.Post(i);
public async Task Process(int i)
{
await Task.Delay(2000);
Console.WriteLine(i);
}
public void Complete()
{
_input.Complete();
_action.Complete(); // When this is removed, program is working as expected
}
public Task Completion => _action.Completion;
}
_action.Complete()
本(コメント行)である場合にテストコードは、コードがactor.Completion.wait()
過去及び "仕上がり"
static void Main(string[] args)
{
var actor = new ActionTester();
actor.Post(5);
actor.Post(7);
actor.Complete();
actor.Completion.Wait();
Console.WriteLine("Finished");
Console.Read();
}
移動する表示なってきています。 _aciton.Complete()
を削除すると、投稿された値が正しく表示され、「Finished」と表示されます。
データフローブロックがリンクされている場合、ルートブロックのみの「完全」と呼ぶべきですか? PropagateCompletion
をtrue/falseに設定しても効果はありません。データフローブロックがリンクされている場合
ソリューション
解決することにより、ルートブロック完了を待た
public void Complete()
{
_input.Complete();
_input.Completion.Wait();
_action.Complete();
}
"PropogateCompletion"がfalseに設定されている場合、リンクされたすべてのブロックでcompleteを呼び出すべきではありませんか?私の例では、たとえPropagateCompletionをfalseに設定したとしても、リンクされたブロックに対してもう1つの呼び出しがあると動作しませんでした。 – Saravanan
**すべてのメッセージが最初から2番目に送信される前に** 2番目のブロックを完了すると、2番目のブロックはすべて破棄されます。したがって、補完を伝播しない場合は、自分で処理する必要があります。 – VMAtm