推荐一个在 .NET 中构建和运行有限状态机的强大框架XStateNet

有限状态机

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();

运行程序后,控制台的输出如下:

推荐一个在 .NET 中构建和运行有限状态机的强大框架XStateNet

项目地址

https://github.com/serge-sedelnikov/xstate.net