在程序的设计过程中,我们经常会遇到一些需要使用状态机的场景,相信状态机的编写和维护是令每一个程序员都非常头大的事情。到了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库的辅助下,类似同步的方式实现的状态机非常直观,我们甚至连状态变量都可以给省掉了,比之前的实现要简洁不少,也能更加容易的实现复杂的状态逻辑。

在C#中用RX库和await来实现直观的状态机的更多相关文章

  1. 在Python中用Request库模拟登录(一):字幕库(无加密,无验证码)

    字幕库的登录表单如下所示,其中省去了无关紧要的内容: <form class="login-form" action="/User/login.html" ...

  2. RX库中的IDisposable对象

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

  3. python中用Pillow库进行图片处理

    一.Python中 PIL 图像处理库简介 PIL可以做很多和图像处理相关的事情: 图像归档(Image Archives).PIL非常适合于图像归档以及图像的批处理任务.你可以使用PIL创建缩略图, ...

  4. 在Python中用Request库模拟登录(四):哔哩哔哩(有加密,有验证码)

    !已失效! 抓包分析 获取验证码 获取加密公钥 其中hash是变化的,公钥key不变 登录 其中用户名没有被加密,密码被加密. 因为在获取公钥的时候同时返回了一个hash值,推测此hash值与密码加密 ...

  5. 在Python中用Request库模拟登录(三):Discuz论坛(未加密,有验证码,有隐藏验证)

    以Discuz的官方站为例.直接点击网页右上角的登录按钮,会弹出一个带验证码的登录窗口.输入验证码之后,会检查验证码是否正确.然后登录.首先,通过抓包分析,这些过程浏览器和服务器交换了哪些数据. 抓包 ...

  6. cuda中用cublas库做矩阵乘法

    这里矩阵C=A*B,原始文档给的公式是C=alpha*A*B+beta*C,所以这里alpha=1,beta=0. 主要使用cublasSgemm这个函数,这个函数的第二个参数有三种类型,这里CUBL ...

  7. RX(Reactive Extinsion)和IX(Interactive Extinsion)库改名了

    RX和IX库是我经常用到的库,今天写一个小程序的时候想用IX库的时候,发现却找不到了.在它的源码的网站上找了一下,发现它们被改名了,具体的变化为为: 对于RX库: Rx-Main -> Syst ...

  8. 快快快!27个提升效率的iOS开源库推荐

    文章来源:http://www.csdn.net/article/2015-07-21/2825264-27-ios-open-source-libraries/1 我热爱开源,更喜爱那些花费宝贵的业 ...

  9. iOS:iOS开发非常全的三方库、插件等等

    iOS开发非常全的三方库.插件等等 github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自git ...

随机推荐

  1. hadoop-搭建(转)--亲测好用 (一)

    1)JDK软件 下载地址:http://www.oracle.com/technetwork/java/javase/index.html 2)Hadoop软件 下载地址:http://hadoop. ...

  2. java 计算精度处理

    1.设计思想: 定义两个字符串number1和number2,分别输入一串数字,然后定义两个BigDecimal类的对象f1,f2分别接收number1和number2的值,然后调用BigDecima ...

  3. linux sort的用法

    sort -n 表示按照数字 sort -k 表示第几列 sort -t : 表示按照:来分列 sort -r  表示从大到小排列

  4. group_load,weight_load,group_capacity, group_weight大致都是啥数值

    [ 113.180820] sgs->group_load:2039,sum_nr_running:2,sum_weighted_load:2039,sgs->group_capacity ...

  5. role management

    role management https://panjiachen.github.io/vue-element-admin/#/permission/page

  6. hdu 1172 猜数字

    猜数字 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  7. poj 1062 昂贵的聘礼 (最短路径)

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33365   Accepted: 9500 Descriptio ...

  8. [poj] 2318 TOYS || 判断点在多边形内

    原题 给出一个矩形玩具箱和其中隔板的位置,求每个玩具在第几个隔间内(保证没有在线上的玩具) 将玩具按x轴排序,记录当前隔板的编号,每次判断是否需要右移(左移)隔板(因为是有序的,所以移动次数左右不厚超 ...

  9. POJ 3421 X-factor Chains | 数论

    题意: 给一个x,求最长的排列满足开头是1,结尾是x,前一个数是后一个数的因子 输出长度和这样序列的个数 题解: 把x分解质因数,质因数个数就是答案,接下来考虑怎么求个数 显然这是一个可重集合全排列问 ...

  10. OpenGL入门学习 课程 (三) 绘制几何图形的一些细节问题

    http://oulehui.blog.163.com/blog/static/79614698201191832753312/ 先回顾一下我们都学习了些什么: 第一课,编写第一个OpenGL程序第二 ...