我如何前进到下一个状态,而不对每条收到的消息重复相同的条件评估?
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
类型的运算符,所以如果你想坚持这种设计,你可能正在这样做据我所知,现在是最不痛苦的方式。
我有一个演员需要从各种来源收集数据,然后才能继续处理。目前,我对每条收到的消息重复相同的条件评估:
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();
,或者这是最好的写法吗?我能找到的大多数示例(例如
您可以使用 FSM<>
class in Akka.NET -docs- -source-,它允许您在处理每个事件后 return 下一个行为。
目前编写的 ReceiveActor
不允许使用 Scala 拥有的很好的 AndThen
类型的运算符,所以如果你想坚持这种设计,你可能正在这样做据我所知,现在是最不痛苦的方式。