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)는 스칼라로 작성되었습니다.이 스칼라는 모든 종류의 구문을 허용하는 것으로 보이며 C#에서는 이와 비슷한 것을 볼 수 없습니다.

답변

1

FSM<> class in Akka.NET -docs--source-을 사용하면 각 이벤트를 처리 할 때 다음 동작을 반환 할 수 있습니다.

현재 쓰여져있는 ReceiveActor은 Scala가 가지고있는 멋진 AndThen 타입의 연산자를 허용하지 않습니다. 그래서이 디자인을 고수하고 싶다면 지금까지 할 수있는 가장 고통스러운 방법 일 것입니다. 텔.

+0

나는'FSM' 클래스의 문서를 간략히 들었고, 필자가 필요로하는 것 같다. "ReceiveActor가 현재 쓰여진 그대로"라고 말하면 파이프 라인에 일부 변경 사항이 있다는 뜻입니까? – Stijn

+1

저는 오늘 배우를'FSM'으로 다시 쓰고 있습니다. 일단 배우가 나오면 함께 일하게되어 기쁩니다. 필자가 소스 코드에서 발견 한'FsmEvent.Match(). <>()'문법을 특히 좋아합니다. 현재 어디서나 문서화되지 않은 것 같습니다. – Stijn

+0

@Stijn 아니요, 우리는 현재 그 문서를 가지고 있지 않습니다. 우리가 분명히 추가해야 할 것입니다. – Aaronontheweb