如果用户尝试在FSM中进入未定义状态,为什么Akka.Net不会发出警告?

时间:2018-09-18 10:03:17

标签: c# akka akka.net fsm

我现在正在学习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是否不应发出警告?为什么不这样做?

1 个答案:

答案 0 :(得分:0)

经过一番研究并感谢我的同事,我了解到在为州指定的任何代表中返回null使得事件由WhenUnhandled()代表进行处理。但是碰巧返回未定义状态(未由任何When()调用指定)会产生相同的行为。

问题是,我没有定义WhenUnhandled()委托,因此对于这些情况,FSM默认使用基本行为:保持相同状态而不执行任何操作。