在C#中用RX库和await来实现直观的状态机
在程序的设计过程中,我们经常会遇到一些需要使用状态机的场景,相信状态机的编写和维护是令每一个程序员都非常头大的事情。到了C# 5.0后,由于引进了await语法糖,我们可以通过await和Reactive Extensions库来简化这一过程,实现非常直观的状态机。
下面我就以一个简单的门的状态机为例:
- 该门有两种状态,关闭和推开。
- 支持两种操作:推和拉。
- 在关闭的时候只接收推操作,变成推开状态
- 在推开的时候只接收拉操作,变成关闭状态
这个例子我很久以前实现过,原文地址:C# 3.0下有限状态机的一种优雅的实现,当时还是C# 3.0,现在在C# 5.0中,我们可以以一种更为优雅的方式来实现他:。
enum Operation { Push, Pull }
class Door
{
Subject<Operation> operationEvent;
public Door()
{
operationEvent = new Subject<Operation>();
ProcessAsync();
}
public void Process(Operation op)
{
operationEvent.OnNext(op);
}
async void ProcessAsync()
{
while (true)
{
//初始门是关闭的
await operationEvent.Where(i => i == Operation.Push).FirstAsync();
Console.WriteLine("门被推开了");
//进入推开状态
await operationEvent.Where(i => i == Operation.Pull).FirstAsync();
Console.WriteLine("门被拉上了");
}
}
}
在await语法糖和RX库的辅助下,类似同步的方式实现的状态机非常直观,我们甚至连状态变量都可以给省掉了,比之前的实现要简洁不少,也能更加容易的实现复杂的状态逻辑。
转载于:https://www.cnblogs.com/TianFang/p/3304615.html
在C#中用RX库和await来实现直观的状态机相关推荐
- Python中用keyboard库实现监听用户输入
Python中用keyboard库实现监听用户输入 前言 一.keyboard库 二.使用示例 1.引入库 前言 在用Python做一个Selenium网页自动化工具时,发现如果用户提供的数据太多,需 ...
- RX库中的IDisposable对象
IDisposable是.net中的主动资源释放接口,它是在编程过程中经常使用到的一个接口,本文介绍一下微软在Rx.NET中提供的一系列常用的Disposable类,通过它们可以简化我们的程序代码,提 ...
- Python中用fabric库来远程连接服务器
日常工作中经常需要通过SSH连接到多台远程服务器来完成各种任务,当需要操作的服务器众多,且要执行的任务涉及命令繁多时,如果可以以自动化的方式模拟SSH连接及执行命令的繁琐过程,对工作效率的提升是非常可 ...
- Python中用turtle库绘制爱心
用Python 绘制"521爱心" turtle库概述: turtle(海龟)库是turtle绘图体系python的实现: turtle绘图体系:1969年诞生,主要用于程序设计入 ...
- codeblocks中用第三方库
第一步:编译第三方库,得到头文件和库,例如路径关系: D:\MyLib\include D:\MyLib\lib 在include中放头文件,在lib中放置库文件. 第二步:创建全局变量,菜单:Set ...
- Python中用turtle库画旋涡
#coding=utf-8# 导入turtle import turtle# 笔的大尺寸 turtle.pensize(2)# 背景颜色 turtle.bgcolor("black" ...
- python turtle画多啦a梦_用Python绘制龟库的哆啦A梦,中用,turtle,库画
#coding=utf8 import turtle import turtle as t # 导入turtle赋值给t turtle.tracer(False) t.speed(10) #笔画绘制的 ...
- Python中用turtle库画哆啦A梦
#coding=utf8import turtle import turtle as t # 导入turtle赋值给t turtle.tracer(False) t.speed(10) #笔画绘制的速 ...
- python vbs库_Python语言之requests库
发送请求.传递URL参数.定制headers.接受数据,处理数据等 在Java中用httpclient jar包,在Python中用requests库,即使没有事先下载,在Pycharm开发工具中,出 ...
最新文章
- CODE[VS] 1275有鱼的声音 2012年CCC加拿大高中生信息学奥赛
- les物流执行系统_物流LES系统上线啦
- 2017-2018-1 20155229 《信息安全系统设计基础》第十三周学习总结
- Java - 强引用、弱引用、软引用、虚引用
- mysql 连接 指定字符集_关于Mysql连接池配置指定字符集的问题
- inventor中齿条怎么画_渐开线齿轮是怎么回事,图解6种齿轮加工工艺
- C++基础::自制异常定位器
- 重构和代码异味——通往更整洁的代码
- ubuntu 安装 ftp server
- 大话设计模式之爱你一万年:第十三章 行为型模式:策略模式:女友在手,说走就走:1.策略模式概念
- 【wps】wps怎样删除中间的一页?
- 操作系统(四)---MS-DOS微软磁盘操作系统
- DataGridView绑定null后再次绑定DataSource列标题成英文
- 人大与加拿大女王大学金融硕士在短学制中成就别样的人生
- python作图之plt.contour详解
- Mathematica画图的问题
- Windows 11强势来袭,一文带你了解全部更新内容
- i.i.d 独立同分布
- 小程序实现滚动加载(懒加载)
- 转载一位老码农的技术理想
热门文章
- oracle 时间按季度,ORACLE时间字段取年、月、日、季度
- java 泛型参数_[基础]-Java泛型
- python打包程序出错_pyinstaller 打包exe,出错,换了个简单的.py文件也不行
- java 判断date为空_java – 如何检查JSONArray元素是否为空
- 计算工资底薪加提成的java_月工资如何计算我是做服务行业,底薪2200全勤100加提成5 - 找法网(findlaw.cn)...
- python 桌面提醒_python实现桌面托盘气泡提示
- python3.7.3 离线安装paramiko_python3和paramiko安装
- enlink请输入正确服务器地址,MXC极域有什么新的消息?
- k6前级效果器怎么用_P18:调制类效果器的那些事儿(Modulation)
- mysql手工注入imformation_mysql 简单手工注入