好的我确定我没有正确使用状态机,但这里是示例代码的子集。这是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()可以解决问题,因此应用程序成功关闭。
处理需要超时并转移到其他状态的状态的推荐方法是什么?示例代码将不胜感激。
答案 0 :(得分:0)
Thread.Sleep
会阻止状态机PassiveStateMachine
和ActiveStateMachine
,这样您就无法在休眠时间内对其他事件作出反应。这可能解释为什么对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)。