我现在正在学习Akka.Net,并尝试编写一个简单的FSM actor。昨天我整天都在努力解决以下谜团。到目前为止,这是我的代码的简化版本:
public MyFSMActor()
{
StartWith(State.A, MyData.Empty);
When(State.A, e => condition0 ? GoTo(State.B) : Stay());
When(State.B, e => condition1 ? condition2 ? Goto(State.C) : GoTo(State.D) : Stay());
When(State.C, e => NotImplementedException());
}
我正在对类进行单元测试,并检查FSM是否符合规范,除非我尝试检查FSM应该转到State.D
的情况。测试始终失败,因为FSM停留在State.B
中。我花了相当长时间才了解到,我没有通过写相应的文字来指定FSM具有State.D
When(State.D, e => Whatever());
但这确实让我感到困惑,因为我期望Akka.Net FSM的实现会以某种方式(通过引发异常或其他方式)警告我试图进入不确定状态的警告。相反,FSM只是停留在当前状态,我不明白为什么。
所以我的问题是:如果用户尝试在FSM中进入未定义状态,Akka.Net是否不应发出警告?为什么不这样做?
答案 0 :(得分:0)
经过一番研究并感谢我的同事,我了解到在为州指定的任何代表中返回null
使得事件由WhenUnhandled()
代表进行处理。但是碰巧返回未定义状态(未由任何When()
调用指定)会产生相同的行为。
问题是,我没有定义WhenUnhandled()
委托,因此对于这些情况,FSM默认使用基本行为:保持相同状态而不执行任何操作。