首页 > 其他分享 >.Net 状态机Stateless

.Net 状态机Stateless

时间:2024-09-14 10:46:32浏览次数:8  
标签:Stateless 触发器 状态 phoneCall 状态机 State Net CopyInsert

Stateless 库中,可以通过配置来获取状态(State)、触发器(Trigger)以及目标状态(Destination State)。以下是如何进行配置的详细说明:

1. 创建状态机

首先,你需要创建一个状态机实例。状态机实例需要指定当前状态和触发器类型。例如:

var phoneCall = new StateMachine<State, Trigger>(State.OffHook);

CopyInsert

在这个例子中,StateTrigger 是枚举类型,State.OffHook 是初始状态。

2. 配置状态和触发器

接下来,你可以配置每个状态的行为,包括允许的触发器和目标状态。例如:

phoneCall.Configure(State.OffHook)
    .Permit(Trigger.CallDialed, State.Ringing);

CopyInsert

在这个例子中,当状态为 OffHook 时,触发器 CallDialed 会将状态转换为 Ringing

3. 获取当前状态和允许的触发器

你可以通过 StateMachine.State 属性获取当前状态,并通过 StateMachine.PermittedTriggers 属性获取当前状态下允许的触发器。例如:

State currentState = phoneCall.State;
IEnumerable<Trigger> allowedTriggers = phoneCall.PermittedTriggers;

CopyInsert

4. 触发状态转换

你可以通过 Fire 方法触发状态转换。例如:

phoneCall.Fire(Trigger.CallDialed);

CopyInsert

这将触发状态从 OffHook 转换到 Ringing

5. 配置子状态和初始状态

如果你有子状态,可以通过 InitialTransition 方法配置初始子状态。例如:

phoneCall.Configure(State.Connected)
    .InitialTransition(State.OnHold);

CopyInsert

在这个例子中,OnHoldConnected 状态的初始子状态。

6. 异步触发器

如果你需要处理异步操作,可以使用 FireAsync 方法。例如:

await phoneCall.FireAsync(Trigger.CallDialed);

CopyInsert

7. 导出状态机图

你可以将状态机导出为 DOT 图格式,以便可视化。例如:

string dotGraph = UmlDotGraph.Format(phoneCall.GetInfo());

CopyInsert

这个字符串可以被渲染为图像,例如使用 Graphviz 工具。

8. 外部状态存储

如果你需要将状态存储在外部对象中,可以在创建状态机时传递读写状态的委托。例如:

var stateMachine = new StateMachine<State, Trigger>(
    () => myState.Value,
    s => myState.Value = s);

CopyInsert

在这个例子中,myState 是一个包含状态值的对象。

9. 事件通知

你可以订阅状态转换事件,以便在状态转换时执行特定操作。例如:

phoneCall.OnTransitioned(t => Console.WriteLine($"Transitioned from {t.Source} to {t.Destination}"));

CopyInsert

10. 保护子句

你可以使用保护子句来决定在多个可能的转换中选择哪一个。例如:

phoneCall.Configure(State.OffHook)
    .PermitIf(Trigger.CallDialed, State.Ringing, () => IsValidNumber);

CopyInsert

在这个例子中,IsValidNumber 是一个布尔函数,用于决定是否允许转换。

标签:Stateless,触发器,状态,phoneCall,状态机,State,Net,CopyInsert
From: https://www.cnblogs.com/cxfeng92/p/18413511

相关文章

  • 1、.Net UI框架:Blazor Hybrid - .Net宣传系列文章
    BlazorHybrid是.NET6中引入的一个新特性,它允许开发者使用Blazor技术开发跨平台的桌面和移动应用程序。BlazorHybrid结合了BlazorWebAssembly和BlazorServer的优势,提供了一种在桌面和移动设备上运行Blazor应用的方法。BlazorHybrid的关键特性包括:跨......
  • 记一次 .NET某上位机视觉程序 卡死分析
    一:背景1.讲故事前段时间有位朋友找到我,说他的窗体程序在客户这边出现了卡死,让我帮忙看下怎么回事?dump也生成了,既然有dump了那就上windbg分析吧。二:WinDbg分析1.为什么会卡死窗体程序的卡死,入口门槛很低,后续往下分析就不一定了,不管怎么说先用!clrstack看下主线程,输出如......
  • 2、.Net 前端框架:ASP.Net Core - .Net宣传系列文章
    ASP.NETCore是一个跨平台、高性能、开源的框架,用于构建现代化的、基于云的、互联网连接的应用程序。它是微软对原始ASP.NET框架的重构和扩展,提供了更多的灵活性和改进的性能。ASP.NETCore可以用于开发Web应用程序、WebAPI、以及服务端渲染的Web页面。ASP.NETC......
  • .NET 9 优化,抢先体验 C# 13 新特性
    合集-.NET基础知识(3) 1..NET9优化,抢先体验C#13新特性08-202.《黑神话:悟空》神话再现,虚幻引擎与Unity/C#谁更强?08-213..NET6.0+WPF使用Prism框架实现导航09-11收起 阅读目录前言新特性总结下载地址参考链接最后前言微软即将在2024年1......
  • .NET 多版本 WinForm 开源控件库 SunnyUI
    合集-.NET开源工具(15) 1..NET开源快捷的数据库文档查询和生成工具07-312..NET结果与错误处理利器FluentResults08-013..NET+WPF桌面快速启动工具GeekDesk08-194.Gradio.NET支持.NET8简化Web应用开发08-265..NET开源实时监控系统-WatchDog08-276.实用接地......
  • 论文复现--基于LeNet网络结构的数字识别
    前言一直就听说学习深度学习无非就是看论文,然后复现,不断循环,这段时间也看了好几篇论文(虽然都是简单的),但是对于我一个人自学,复现成功,我感觉还是挺开心的本人初学看论文的思路:聚焦网络结构与其实验的效果LeNet虽然简单,很老了,但是毕竟经典,对于初学的的我来说,我感觉还是很......
  • 在arm64 架构上安装dotnet 8.0.8 LTS
    树莓派4B是arm64的。在arm64上面运行aptlistdotnet是不会出来可用的dotnet的,即使aptupdate多次也一样。 好在dotnet本身是支持arm/arm64架构的,只是安装的时候不能使用apt罢了。那么久使用scripts来进行安装好了。 wget下载到本地之后,先chmod+x,就我自己的体验......
  • Acunetix v24.8 - 29 Aug 2024 高级版漏洞扫描器(最新版) 附Windows/Linux下载链接
    前言AcunetixPremium是一种Web应用程序安全解决方案,用于管理多个网站、Web应用程序和API的安全。集成功能允许您自动化DevOps和问题管理基础架构。AcunetixPremium:全面的Web应用程序安全解决方案Web应用程序对于企业和组织与客户、合作伙伴和员工的联系至关......
  • 一款.NET开源、简洁易用的Windows桌面小说阅读应用
    前言今天大姚给大家分享一款.NET开源、免费、简洁易用的Windows桌面小说阅读应用(是原生的Windows应用,为Windows11系统设计):CleanReader.Desktop。该应用适合喜欢阅读网文或者是本地轻量阅读的用户。系统要求操作系统:Windows11版本22000.0或更高版本应用功能自适应阅读亮......
  • 一个库帮你轻松的创建漂亮的.NET控制台应用程序
    前言做过.NET控制台应用程序的同学应该都知道原生的.NET控制台应用程序输出的内容都比较的单调,假如要编写漂亮且美观的控制台输出内容或者样式可能需要花费不少的时间去编写代码和调试。今天大姚给大家分享一个.NET开源且免费的类库帮你轻松的创建漂亮、美观的.NET控制台应用程序:Sp......