2016-11-11 5 views
0

私は、Become()メソッドによって切り替えられた、切り替え可能な振る舞いを持つReceive Actorを持っています。子アクターを監視するには、すべての状態メソッドに対してReceive < Terminated>呼び出しを追加する必要があります。例えばReceiveActorのコード複製を減らす方法

、私の代わりに、あなたのようにTerminatedの型を取るプライベートメソッドを作成することができ、あなたのアクションを実行するためにラムダを使用している

public class SomeActor : ReceiveActor 
{ 
    public SomeActor() 
    { 
     // create child actors 
     Become(Ready); 
    } 

    private void Ready() 
    { 
     Receive<InitMessage>(m => 
     { 
      Become(Working1); 
     }); 

     Receive<Terminated>(m => 
     { 
      // duplicated termination stuff 
      Become(Terminated); 
     }); 
    } 

    private void Working1() 
    { 
     Receive<InitMessage>(m => 
     { 
      Become(Working2); 
     }); 

     Receive<Terminated>(m => 
     { 
      // duplicated termination stuff 
      Become(Terminated); 
     }); 
    } 

    private void Working2() 
    { 
     Receive<InitParcerMessage>(m => 
     { 
      Become(Working1); 
     }); 

     Receive<Terminated>(m => 
     { 
      // duplicated termination stuff 
      Become(Terminated); 
     }); 
    } 

    private void Terminated() 
    { 
     // do some stuff 
    } 
} 
+1

実際に達成しようとしていることを理解するのは難しいです。アクターの監視/見方では、アクターは 'Context.Watch(actorRef)'を使ってalivenessをチェックすることに関連する用語です。実際にここで何を監視したいのかを記述してください。 – Horusiath

+0

イベントをトリガーし、すべての子をサブスクライブして、いつ終了するか、途中でTerminatedメソッドを処理するかを知らせることができます。 – Zinov

+0

@Zinovあなたは単純なC#イベントを意味しますか? – bonzaster

答えて

0

準備、Working1とWorking2メソッドに貼り付けする必要がありますパラメータを入力し、ReceiveのアクションでMethodGroupを使用してください。

public class SomeActor : ReceiveActor 
{ 
    public SomeActor() 
    { 
     // create child actors 
     Become(Ready); 
    } 

    private void Ready() 
    { 
     Receive<InitMessage>(m => 
     { 
      Become(Working1); 
     }); 

     ConfigureReceive(); 
    } 

    private void Working1() 
    { 
     Receive<InitMessage>(m => 
     { 
      Become(Working2); 
     }); 

     ConfigureReceive(); 
    } 

    private void Working2() 
    { 
     Receive<InitParcerMessage>(m => 
     { 
      Become(Working1); 
     }); 

     ConfigureReceive(); 
    } 

    private void Terminated() 
    { 
     // do some stuff 
    } 

    private void ConfigureReceive() 
    { 
     // Register Receive actors here 
     Receive<Terminated>(p => HandleTermination(p)); 
    } 

    // Here's our method to perform the same job with our Terminated parameter 
    private void HandleTermination(Terminated termination) 
    { 
     // Call our Become method 
     Become(Terminated); 
    } 
} 
+0

は同意することができますが、とにかくこれを追加する必要があります_Receive (HandleTermination); _どこでも。想像してみてください。このように複数のメッセージタイプを処理したいと思ったら、それはもっと重複した行になります。 – bonzaster

+0

私はコードスニペットを更新しました。あなたはどこかでコードの複製を持たなければならないでしょうが、このアップデートはメソッド内で 'Receive'を保つために削除して、コードを更新する必要があります。 – ColinM

+0

ありがとう、それは答えのようです – bonzaster

関連する問題