zoukankan      html  css  js  c++  java
  • 让IObservable支持await操作

    C# 4.5中引入了await关键字,可以让大大简化异步编程操作。在Reactive Extensions v2.0中实现了让IObservable支持await操作,通过它我们可以简化observable的异步编程:

        static async Task Samples()
        {
            var xs = Observable.Range(010, ThreadPoolScheduler.Instance);

            Console.WriteLine("Last  = " + await xs);
            Console.WriteLine("First = " + await xs.FirstAsync());
            Console.WriteLine("Third = " + await xs.ElementAt(3));
            Console.WriteLine("All   = " + string.Join("", await xs.ToList()));

            try
            {
                Console.WriteLine("Error = " + await xs.Select(x => 1 / (5 - x)));
            }
            catch (DivideByZeroException)
            {
                Console.WriteLine("Yups, we failed!");
            }
        }

     但是,RX v2.0的await扩展目前只支持.net 4.5,如果我们要在.net 4.0或以下的版本中则无法使用。因此,我手动写了个扩展函数,让IObservable支持await操作。这样一来我们也可以在.net 4.0的observable的异步编程中使用await了。

        static class ObservableExtend
        {
            public static ObservableAwaiter<T> GetAwaiter<T>(this IObservable<T> stream)
            {
                return new ObservableAwaiter<T>(stream);
            }
        }

        class ObservableAwaiter<T> : System.Runtime.CompilerServices.INotifyCompletion
        {
            IObservable<T> stream;
            T result;
            Exception err;

            public ObservableAwaiter(IObservable<T> stream)
            {
                this.stream = stream;
            }

            public bool IsCompleted { get { return false; } }

            public void OnCompleted(Action continuation)
            {
                stream.Subscribe(item => this.result = item,
                    err => { this.err = err; continuation(); },
                    () => continuation());
            }

            public T GetResult()
            {
                if (err != null)
                    throw err;

                return result;
            }
        }

    由于目前.net 4.5还没有正式版,这里我使用的环境是VisualStudio 2012 RC,不保证正式版本中GetAwaiter约束是否和现在一致,不过估计也差不多。

    用了一段时间后,感觉IObservable和await关键字配合起来非常好用,前面我也写过两个简单的扩展函数,感兴趣的朋友可以看一下。

  • 相关阅读:
    剑指offer39-平衡二叉树
    剑指offer37-数字在排序数组中出现的次数
    剑指offer36-两个链表的第一个公共结点
    剑指offer31-整数中1出现的次数
    剑指offer30-连续子数组的最大和
    剑指offer28-数组中出现次数超过一半的数字
    剑指offer26-二叉搜索树与双向链表
    剑指offer21-栈的压入、弹出序列
    剑指offer16-合并两个排序的链表
    C#-杂碎
  • 原文地址:https://www.cnblogs.com/TianFang/p/2545680.html
Copyright © 2011-2022 走看看