2017-10-02 2 views
0

私は、処理を続ける前に、さまざまなソースからデータを収集する必要があるアクターを持っています。現在、私は、各受信したメッセージに同じ条件評価を繰り返します受信したメッセージごとに同じ条件評価を繰り返さずに、次の状態に進めるにはどうすればよいですか?

private Foo foo; 
private Bar bar; 

private void DoSomething(DoSomething message) 
{ 
    this.BecomeWaitingForInputData(); 

    this.GetFoo(message.FooId); /* sends message */ 
    this.GetBar(message.BarId); /* sends message */ 
} 

private void BecomeWaitingForInputData() 
{ 
    this.Become(() => 
    { 
     this.Receive<Foo>((message) => 
     { 
      this.CollectFoo(message); /* assigns to foo */ 
      this.ProcessInputDataIfReady(); 
     }); 

     this.Receive<Bar>((message) => 
     { 
      this.CollectBar(message); /* assigns to bar */ 
      this.ProcessInputDataIfReady(); 
     }); 
    }); 
} 

private void ProcessInputDataIfReady() 
{ 
    if (this.foo == null || this.bar == null) return; 
    /* ... */ 
    this.BecomeWaitingForProcessResults(); 
} 

this.ProcessInputDataIfReady();を繰り返さないようにする方法はありますか、これはそれを書くための最善の方法は何ですか?私が見つけたほとんどの例(例:this one)は、Scalaで書かれています。これは、あらゆる種類の派手な文章を構文で許可するようですが、C#ではこれと同等のものは実際には見えません。

答えて

1

FSM<> class in Akka.NET -docs--source-を使用すると、各イベントの処理時に次の動作を返すことができます。

現在書かれているとおり、AndThen型の演算子はScalaにはありません。この設計に固執したいのであれば、今のところ私はできるだけ痛みを伴わない方法です教えてください。

+0

私は 'FSM'クラスのドキュメントを簡単に見ました。これは私が必要としているものと思われます。 「ReceiveActorは現在書かれているように」と言うと、パイプラインにいくつかの変更があることを意味しますか? – Stijn

+1

私は今日、私の俳優を「FSM」として書き直してきました。そして、あなたがそれをやり遂げたら、一緒に仕事をするのは楽しいことです。私はソースコードで見つかった 'FsmEvent.Match()。<>()'構文が特に好きですが、現時点でどこにも書かれていないようですね。 – Stijn

+0

@Stijnいいえ、現時点ではドキュメントはありません。間違いなく追加する必要があります。 – Aaronontheweb

関連する問題