好吧,我确信我没有正确使用状态机,但这是示例代码的子集。这是 Appccelerate.StateMachine,以前是 bbvcommon.StateMachine。
fsm.In(State.Idle)
.ExecuteOnEntry(() => {
// wake up and check if there are people still standing and if so restart
if(currentlyTalkingTo.Count() > 0)
{
fsm.Fire(Event.PersonFound);
}
})
.On(Event.PersonFound).Goto(State.WaitToRecognizePeople);
fsm.In(State.WaitToRecognizePeople)
.ExecuteOnEntry(() => {
Thread.Sleep(1000);
fsm.Fire(Event.TimeOut);
})
.On(Event.TimeOut).Goto(State.Greet);
问题是处理睡眠的最佳方法是什么?使用此代码,在关闭应用程序时调用 fsm.Stop() 有时会挂起应用程序。注释状态中的所有 Thread.Sleeps() 可以修复该问题,以便应用程序成功关闭。
处理需要超时并移动到另一个状态的状态的推荐方法是什么?示例代码将不胜感激。
Thread.Sleep
会阻塞状态机,包括 PassiveStateMachine
和 ActiveStateMachine
,以便您在睡眠期间无法再对其他事件做出反应。这可能可以解释为什么调用 Stop
有时会挂起解释。
我假设您不仅仅想等待给定的时间段,而是想在超时条件下等待某些事件。然后,我建议在
Timer
的 ExecuteOnEntry
中启动一个 WaitToRecognizePeople
,当过去时,会触发事件 Event.Timeout
。
如果您有许多具有关联超时的状态,为了避免大量重复的代码,您甚至可以在单独的类中将其作为状态机扩展来实现,就像我在使用此库的一个项目中所做的那样。 (参见 http://appccelerate.github.io/statemachineextensions.html)。