2017-08-09 16 views
2

ActionBlockにリンクされたBroadcastBlockがあります。 BroadcastBlockActionBlockの両方で「完了」と呼ぶと、それは機能しません。ちょうど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(); 
} 

答えて

2

、私たちは唯一のルートブロックの「完了」を呼び出す必要がありますか?

はい、これはまさにあなたがするべきことです。

あなたがCompletionを伝播行う場合、あなたはは自分で_actionBlockを完了する必要はありません - バッファからすべての項目が処理された後、それが完了します。アクションブロックを完了すると、新しいメッセージは受け入れられないので、説明された動作は期待され、有効です。

+0

"PropogateCompletion"がfalseに設定されている場合、リンクされたすべてのブロックでcompleteを呼び出すべきではありませんか?私の例では、たとえPropagateCompletionをfalseに設定したとしても、リンクされたブロックに対してもう1つの呼び出しがあると動作しませんでした。 – Saravanan

+0

**すべてのメッセージが最初から2番目に送信される前に** 2番目のブロックを完了すると、2番目のブロックはすべて破棄されます。したがって、補完を伝播しない場合は、自分で処理する必要があります。 – VMAtm

関連する問題