• 在C#中用RX库和await来实现直观的状态机


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

  • 相关阅读:
    navicat常用快捷键与SQL基本使用
    【Excel实战】公式应用:如何按照某种类型数量排序
    Typora+Markdown便捷发布blog
    【Vulnhub】DC-2靶机
    【转载】阮一峰网络日志中的JWT入门
    【动态规划】闫氏dp分析
    Markdown Latex数学公式
    【每日一题】两个数组的交集
    【每日一题】前k个高频元素
    HashMap的各种遍历和删除方式总结
  • 原文地址:https://www.cnblogs.com/TianFang/p/3304615.html
Copyright © 2020-2023  润新知