.NET 中构建和运行有限状态机的强大框架
The following article is from Dotnet 工具箱 Author 工具箱
有限状态机
XStateNet 是有限状态机框架的.NET 实现。用于在 .NET 中构建和运行有限状态机的强大框架。
有限状态机(Finite State Machine,简称FSM)是计算机科学中的一种抽象模型,用于描述对象或系统在不同状态之间的转换和行为。它在编程中被广泛用于建模、设计和实现各种系统,例如软件应用、硬件控制、游戏逻辑等。
有限状态机主要由以下几个要素组成:
1、状态(States):状态是系统可能处于的不同情况或阶段。每个状态代表系统的一个特定状态或配置。
2、转换(Transitions):转换定义了在一个状态下系统如何根据输入、事件或条件切换到另一个状态。转换通常与特定的操作或行为相关联。
3、事件(Events):事件是触发状态转换的信号。当系统接收到一个事件时,它可能会从当前状态转移到一个新的状态。
4、动作(Actions):动作是在状态转换发生时执行的操作。这些操作可以包括计算、输出、状态更新等。任何系统都是状态和转移的组合,或者至少可以表示为状态图。状态机的每个状态都是一个原子执行上下文。
如何使用
下面是一个红绿灯场景的示例,展示了如何构建并运行状态机。首先,通过 Nuget 安装并引用 XStateNet:
using XStateNet;
定义四个状态,红灯,绿灯,黄灯,还有一个异常状态。
State redLight = new State("红灯");
State amberLight = new State("黄灯");
State greenLight = new State("绿灯");
State errorBlinkingAmber = new State("error");
对每个状态进行配置。
redLight.WithInvoke(async (callback) => {
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("红灯亮!!! STOP!");
await Task.Delay(1000);
if (isError)
{
await callback("ERROR");
}
else
{
await callback("红灯结束");
}
})
.WithTransition("ERROR", "error")
.WithTransition("红灯结束", "黄灯");
amberLight.WithInvoke(async (cancel) => {
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("黄灯亮! 注意!");
await Task.Delay(3000, cancel);
}, "绿灯", "error");
greenLight.WithTimeout(5000, "红灯")
.WithActionOnEnter(() => {
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("绿灯亮! Go go go!");
})
.WithActionOnExit(() => {
isError = new Random().NextDouble() > 0.5;
});
errorBlinkingAmber.WithInvoke(async (callback) => {
Console.WriteLine("发生错误!");
Console.WriteLine($"尝试修复... 第 {fixAttempt} 次");
await Task.Delay(1000);
isError = new Random().NextDouble() > 0.5;
if (isError)
{
Interlocked.Increment(ref fixAttempt);
await callback("未修复");
}
else
{
Interlocked.Exchange(ref fixAttempt, 1);
await callback("已修复");
}
})
.WithTransition("未修复", "error")
.WithTransition("已修复", "红灯");
最后,启动配置好的状态机。
StateMachine machine = new StateMachine("红绿灯", "红绿灯状态机", redLight.Id);
machine.States = new[]
{
redLight, amberLight, greenLight, errorBlinkingAmber
};
Interpreter interpreter = new Interpreter(machine);
await interpreter.StartStateMachineAsync();
运行程序后,控制台的输出如下:
项目地址
https://github.com/serge-sedelnikov/xstate.net
- EOF -
看完本文有收获?请转发分享给更多人
推荐关注「DotNet」,提升.Net技能
点赞和在看就是最大的支持❤️