Tag: state machines

自动推进状态机与无状态

我最近一直在试验Stateless(C#中的HSM)( https://code.google.com/p/stateless/ ),而且我遇到了一些我不确定如何实现的东西。 假设我有以下状态: 开始。 连 读 完 我想要实现的是:当建立TCP连接(处于连接状态)时,进入读状态。 或者,如果失败,则进入“完成”状态(可以返回“连接”状态并在超时后尝试新连接)。 如何使用Stateless实现此自动推进function,因为从状态内触发触发器会导致堆栈溢出exception? 干杯

如何从bbv.Common.StateMachine(现在的Appccelerate.StateMachine)类中获取当前状态?

bbv.Common.StateMachine类是我见过的最好的状态机代码。 但它只缺少一件事:获得当前状态。 这是一个订单跟踪系统: fsm = new ActiveStateMachine(); fsm.In(States.OrderCreated) .On(Events.Submitted) .Goto(States.WaitingForApproval); fsm.In(States.WaitingForApproval) .On(Events.Reject) .Goto(States.Rejected); fsm.In(States.WaitingForApproval) .On(Events.Approve) .Goto(States.BeingProcessed); fsm.In(States.BeingProcessed) .On(Events.ProcessFinished) .Goto(States.SentByMail); fsm.In(States.SentByMail) .On(Events.Deliver) .Goto(States.Delivered); fsm.Initialize(States.OrderCreated); fsm.Start(); fsm.Fire(Events.Submitted); // Save this state to database 你可以很容易地看到它的工作原理。 但我想在数据库中保存订单状态。 所以我将能够显示订单的状态。 我需要一个 fsm.GetCurrentState() //show this state in the a table 方法。 实际上有一种方法:我可以使用ExecuteOnEntry并在每个州的条目上更改本地值。 但是为每个州编写ExecuteOnEntry会很麻烦,因为我会重复自己! 必须有一种微妙的方式来做到这一点。

使用无状态的基本状态机设置

我有一些相当简单的状态需求(目前)。 我想我想使用无状态 api对这些进行建模。 (但我对状态机并不是很了解,所以我可能错了。) 但是我被卷入术语(特别是状态和触发器 ) 这是一个例子:我有一个订单类。 它设置有几个状态。 它们是:新的,填充的,装运的,已完成的,已取消的。 我想要的一些简单的状态规则是允许这些状态转换: 新的(默认) 新 – >填充 新 – >已取消 填充 – >运输 填充 – >已取消 填充 – >运输 送货 – >完成 那么我在这里被绊倒的是我的“触发器”是什么? 如果需要更具体的示例,请说我想要一个这样的方法: public bool UpdateOrderStatus(int OrderId, OrderStatusEnum NewOrderStatus) 如果状态更新成功,则返回true。 如何设置和使用Stateless来实现这一目标?

测试大型状态机有哪些策略?

我inheritance了一个庞大且相当复杂的状态机。 它有31种可能的状态,都是真正需要的(大业务流程)。 它有以下输入: 枚举:当前状态(所以0 – > 30) 枚举:来源(目前只有2个条目) 布尔值:请求 布尔值:类型 枚举:状态(3个州) 枚举:处理(3个州) 布尔值:已完成 将其分解为单独的状态机似乎不可行,因为每个状态都是不同的。 我为最常见的输入编写了测试,每个输入一个测试,所有输入都是常量,除了State。 [Subject(“Application Process States”)] public class When_state_is_meeting2Requested : AppProcessBase { Establish context = () => { //Setup…. }; Because of = () => process.Load(jas, vac); It Current_node_should_be_meeting2Requested = () => process.CurrentNode.ShouldBeOfType(); It Can_move_to_clientDeclined = () => Check(process, process.clientDeclined); It Can_move_to_meeting1Arranged = […]

使用“yield”关键字实现状态机

使用yield关键字来实现这里所示的简单状态机是否可行。 对我来说,看起来C#编译器已经为你完成了艰苦的工作,因为它在内部实现了一个状态机来使yield语句工作。 你可以在编译器已经在做的工作之上捎带并让它为你实现大部分状态机吗? 有没有人这样做,技术上是否可行?