zoukankan      html  css  js  c++  java
  • 在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库的辅助下,类似同步的方式实现的状态机非常直观,我们甚至连状态变量都可以给省掉了,比之前的实现要简洁不少,也能更加容易的实现复杂的状态逻辑。

  • 相关阅读:
    迭代器和生成器
    函数嵌套
    页面调用dll
    C++MFC之picture control控件铺满图片
    C++中去掉string字符串中的 等
    C++之map使用
    C++之条形码,windows下zint库的编译及应用(二)
    C++之条形码,windows下zint库的编译及应用(一)
    C++通过HTTP请求Get或Post方式请求Json数据(转)
    从长字符串中获取想要的字符串
  • 原文地址:https://www.cnblogs.com/TianFang/p/3304615.html
Copyright © 2011-2022 走看看