使用计时器

时间:2015-09-16 00:52:28

标签: c# state-machine

好的我确定我没有正确使用状态机,但这里是示例代码的子集。这是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()可以解决问题,因此应用程序成功关闭。

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

1 个答案:

答案 0 :(得分:0)

Thread.Sleep会阻止状态机PassiveStateMachineActiveStateMachine,这样您就无法在休眠时间内对其他事件作出反应。这可能解释为什么对Stop的调用有时会挂起解释。

我假设你不想等待一段时间但是想在超时条件下等待一些事件。然后,我建议在Timer ExecuteOnEntry WaitToRecognizePeople开始Event.Timeout,当过去时,会触发事件R> library(Rblpapi) R> bds("CPI YOY INDEX", "ECO_RELEASE_DT_LIST") Ecostats Release Date 1 20150116 2 20150226 3 20150324 4 20150417 5 20150522 6 20150618 7 20150717 8 20150819 9 20150916 10 20151015 11 20151117 12 20151215 13 20160120 14 20160219 15 20160316 16 20160414 17 20160517 18 20160616 19 20160715 20 20160816 21 20160916 22 20161018 23 20161117 24 20161215 R>

如果你有很多状态都有相关的超时,为了避免大量的重复代码,你甚至可以在一个单独的类中实现它作为状态机扩展,就像我在我的一个使用这个库的项目中所做的那样。 (见http://www.appccelerate.com/statemachineextensions.html)。