我如何前进到下一个状态,而不对每条收到的消息重复相同的条件评估?

How do I advance to the next state, without repeating the same condition evaluation for each received message?

我有一个演员需要从各种来源收集数据,然后才能继续处理。目前,我对每条收到的消息重复相同的条件评估:

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();,或者这是最好的写法吗?我能找到的大多数示例(例如 )都是用 Scala 编写的,它的语法似乎允许各种花哨的东西,而我在 C# 中并没有真正看到它的等价物。

您可以使用 FSM<> class in Akka.NET -docs- -source-,它允许您在处理每个事件后 return 下一个行为。

目前编写的 ReceiveActor 不允许使用 Scala 拥有的很好的 AndThen 类型的运算符,所以如果你想坚持这种设计,你可能正在这样做据我所知,现在是最不痛苦的方式。