本文主要是介绍【转】浅析C# 状态机Stateless,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近在折腾一些控制相关的软件设计,想起来 状态机 这个东西,对解决一些控制系统状态切换还是挺有用的。
状态机(有限状态自动机)网上有很多介绍。简单理解就是定义一系列状态,通过一系列的事件,可以使得状态可以相互之间切换。
如果不使用状态机的思想来编程,那么针对过程的编程方法会使得程序拓展性变差,并且不容易调试。而状态机只需要定义好了各种状态和状态切换之间的事件,你只管触发事件,剩下的事情它自己就自动完成了(毕竟名称叫做有限状态自动机),这对于很多需要定义各种控制阶段的系统简直是完美适配。了解到.NET也有很多库可以实现这些功能,本文主要介绍一下Stateless的应用。
Stateless介绍
Stateless可以创建极简的状态机与对应的工作流。很多项目(包括VisualStudio Extension、AIlab)都有使用到它。
它支持以下特性:
- 支持各种类型作为状态和触发事件
- 支持状态继承
- 支持状态进入/离开事件
- 支持条件状态转移
- 支持状态/转移查询
也有几点需要注意的:
- 它支持异步语法,但是它是单线程的,不是线程安全的。
- 可以导出DOT graph
安装起来很简单,直接在nuget中安装即可:
Install-Package Stateless
Stateless使用
用起来也挺简单的,以打电话这个事情为例,针对打电话的种种动作和状态做成一个状态机。
需要先定义一些状态和事件/触发器,电话有拨号、接通、留言等事件,有响铃、挂起、挂断等状态:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
然后就是创建一个状态机了:
1 |
|
最后也是最需要详细解释的,就是配置状态机的行为了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|
配置好了各状态之间的转换,下面就是触发事件了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
外部调用很简洁:
1 2 3 4 |
|
只需要调用事件即可,别的都会按照我们设置好的动作来进行了,非常自动化。
总结
Stateless可以很好地实现状态机,有点事件驱动的编程的感觉,但本质上不同,Stateless核心是各个状态的迁移。
虽然Stateless很小巧方便,但是还有有很多地方不尽如人意(官方说这就是他们自己的设计目标,维持极简):
- 没有启动和停止的说法,一般在构造函数里面创建就一直有效。
- 不是线程安全的
- 拓展性有限
还有一个Appccelerate.StateMachine
(地址),这个支持四种不同的状态机实现:
- Passive State Machine: 同步单线程处理状态转换
- Active State Machine: 同步多线程处理状态转换
- Async Passive State Machine: 异步单线程处理状态转换
- Async Active State Machine: 异步多线程处理状态转换
其中active的是线程安安全的。另外,它还支持状态、事件的持久化,拓展性强。用法差不多,只是配置的关键字上面有一点区别,大家可以自行翻文档。
这篇关于【转】浅析C# 状态机Stateless的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!