使用状态机

时间:2015-06-11 19:00:39

标签: c# state-machine-workflow

我在我的c#GUI应用程序中使用状态机。有了这个,我有几个状态和一个名为ErrorHappened的状态。状态机可以从每个状态进入这些错误状态。但是使用这种架构我首先知道当状态机进入状态ErrorHappened时发生错误。

但是,在从一个状态A转换到状态B的过程中,如果发生错误,我该怎么办?问题是然后状态机从状态A进入状态B进入状态ErrorHappened。通常我会在完成向状态B的转换时执行操作。如果转换期间出错,我不会执行此操作。当然我可以引入像m_ErrorHappened这样的bool变量,但在我看来我有一个状态机,所以我不会被迫使用任何状态变量。

我希望解释清楚,足以提供任何帮助。

示例代码:

StateMachine sm; // initial state is state A

void AtoB() // executed during transition from A to B
{
  if(DoSomething())
  {
    print("Error");
    // Event ErrorHappened, state machine goes into state Error
    sm.GotoState(ErrorHappened); 
  }
}

void TransitionEnd(State NewState)
{
    if(NewState==B)
    {
        GreenLight();
    }

    if(NewState==Error)
    {
        RedLight();
    }
}

main()
{
    sm.GotoState(B);
}

现在当发生错误时,绿色然后红灯亮起。因为状态机从状态A进入状态B到错误状态。有没有办法检测到错误,只有红灯亮?

1 个答案:

答案 0 :(得分:1)

您可能希望更改状态机设计,以便转换不会引发错误:保证转换在设计时没有错误。

与允许转换错误的模型相比,您必须添加更多状态和转换,但接下来会出现错误检测和错误处理的位置。

在这样的设计中,您将使用一般的转换机制,并且任何自定义处理程序都将与状态相关联,而您可能正在显示的是与转换关联的自定义处理程序(也可能是状态的通用处理程序,I不能从提供的代码中说出来。

例如,除了从A到B的转换之外,您可能还需要添加从A到某种错误状态的转换,其选择取决于A的自定义处理程序。或者,您可能在A和A之间引入状态。 B判断是否存在错误,如果不存在则转到B,否则转到错误状态。