使用计时器加速状态机状态

问题描述 投票:0回答:1

好吧,我确信我没有正确使用状态机,但这是示例代码的子集。这是 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() 可以修复该问题,以便应用程序成功关闭。

处理需要超时并移动到另一个状态的状态的推荐方法是什么?示例代码将不胜感激。

c# state-machine
1个回答
0
投票

Thread.Sleep
会阻塞状态机,包括
PassiveStateMachine
ActiveStateMachine
,以便您在睡眠期间无法再对其他事件做出反应。这可能可以解释为什么调用
Stop
有时会挂起解释。

我假设您不仅仅想等待给定的时间段,而是想在超时条件下等待某些事件。然后,我建议在

Timer
ExecuteOnEntry
中启动一个
WaitToRecognizePeople
,当过去时,会触发事件
Event.Timeout

如果您有许多具有关联超时的状态,为了避免大量重复的代码,您甚至可以在单独的类中将其作为状态机扩展来实现,就像我在使用此库的一个项目中所做的那样。 (参见 http://appccelerate.github.io/statemachineextensions.html)。

© www.soinside.com 2019 - 2024. All rights reserved.