在程序的设计过程中,我们经常会遇到一些需要使用状态机的场景,相信状态机的编写和维护是令每一个程序员都非常头大的事情。到了C# 5.0后,由于引进了await语法糖,我们可以通过await和Reactive Extensions库来简化这一过程,实现非常直观的状态机。

下面我就以一个简单的门的状态机为例:

  1. 该门有两种状态,关闭和推开。
  2. 支持两种操作:推和拉。
  3. 在关闭的时候只接收推操作,变成推开状态
  4. 在推开的时候只接收拉操作,变成关闭状态

这个例子我很久以前实现过,原文地址: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来实现直观的状态机相关推荐

  1. Python中用keyboard库实现监听用户输入

    Python中用keyboard库实现监听用户输入 前言 一.keyboard库 二.使用示例 1.引入库 前言 在用Python做一个Selenium网页自动化工具时,发现如果用户提供的数据太多,需 ...

  2. RX库中的IDisposable对象

    IDisposable是.net中的主动资源释放接口,它是在编程过程中经常使用到的一个接口,本文介绍一下微软在Rx.NET中提供的一系列常用的Disposable类,通过它们可以简化我们的程序代码,提 ...

  3. Python中用fabric库来远程连接服务器

    日常工作中经常需要通过SSH连接到多台远程服务器来完成各种任务,当需要操作的服务器众多,且要执行的任务涉及命令繁多时,如果可以以自动化的方式模拟SSH连接及执行命令的繁琐过程,对工作效率的提升是非常可 ...

  4. Python中用turtle库绘制爱心

    用Python 绘制"521爱心" turtle库概述: turtle(海龟)库是turtle绘图体系python的实现: turtle绘图体系:1969年诞生,主要用于程序设计入 ...

  5. codeblocks中用第三方库

    第一步:编译第三方库,得到头文件和库,例如路径关系: D:\MyLib\include D:\MyLib\lib 在include中放头文件,在lib中放置库文件. 第二步:创建全局变量,菜单:Set ...

  6. Python中用turtle库画旋涡

    #coding=utf-8# 导入turtle import turtle# 笔的大尺寸 turtle.pensize(2)# 背景颜色 turtle.bgcolor("black" ...

  7. python turtle画多啦a梦_用Python绘制龟库的哆啦A梦,中用,turtle,库画

    #coding=utf8 import turtle import turtle as t # 导入turtle赋值给t turtle.tracer(False) t.speed(10) #笔画绘制的 ...

  8. Python中用turtle库画哆啦A梦

    #coding=utf8import turtle import turtle as t # 导入turtle赋值给t turtle.tracer(False) t.speed(10) #笔画绘制的速 ...

  9. python vbs库_Python语言之requests库

    发送请求.传递URL参数.定制headers.接受数据,处理数据等 在Java中用httpclient jar包,在Python中用requests库,即使没有事先下载,在Pycharm开发工具中,出 ...

最新文章

  1. CODE[VS] 1275有鱼的声音 2012年CCC加拿大高中生信息学奥赛
  2. les物流执行系统_物流LES系统上线啦
  3. 2017-2018-1 20155229 《信息安全系统设计基础》第十三周学习总结
  4. Java - 强引用、弱引用、软引用、虚引用
  5. mysql 连接 指定字符集_关于Mysql连接池配置指定字符集的问题
  6. inventor中齿条怎么画_渐开线齿轮是怎么回事,图解6种齿轮加工工艺
  7. C++基础::自制异常定位器
  8. 重构和代码异味——通往更整洁的代码
  9. ubuntu 安装 ftp server
  10. 大话设计模式之爱你一万年:第十三章 行为型模式:策略模式:女友在手,说走就走:1.策略模式概念
  11. 【wps】wps怎样删除中间的一页?
  12. 操作系统(四)---MS-DOS微软磁盘操作系统
  13. DataGridView绑定null后再次绑定DataSource列标题成英文
  14. 人大与加拿大女王大学金融硕士在短学制中成就别样的人生
  15. python作图之plt.contour详解
  16. Mathematica画图的问题
  17. Windows 11强势来袭,一文带你了解全部更新内容
  18. i.i.d 独立同分布
  19. 小程序实现滚动加载(懒加载)
  20. 转载一位老码农的技术理想

热门文章

  1. oracle 时间按季度,ORACLE时间字段取年、月、日、季度
  2. java 泛型参数_[基础]-Java泛型
  3. python打包程序出错_pyinstaller 打包exe,出错,换了个简单的.py文件也不行
  4. java 判断date为空_java – 如何检查JSONArray元素是否为空
  5. 计算工资底薪加提成的java_月工资如何计算我是做服务行业,底薪2200全勤100加提成5 - 找法网(findlaw.cn)...
  6. python 桌面提醒_python实现桌面托盘气泡提示
  7. python3.7.3 离线安装paramiko_python3和paramiko安装
  8. enlink请输入正确服务器地址,MXC极域有什么新的消息?
  9. k6前级效果器怎么用_P18:调制类效果器的那些事儿(Modulation)
  10. mysql手工注入imformation_mysql 简单手工注入