初识响应式,Rx.Net

贴一下代码:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApp1 {
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e) {
            this.Async();
        }
        void Sync() {
            for (int i = 0; i < 10; i++) {
                this.tb.Text = i.ToString();
            }
        }
        void Async() {
            var x = from i in AsyncItem2()
                    where i%2==0 select i;
            x.Subscribe(
                i => this.tb.Text = i.ToString(),
                i=>this.tb.Text="xxxxx"
            );            
        }
        async IAsyncEnumerable<int> AsyncItem() {
            for (int i = 0; i < 12; i++) {
                await Task.Delay(1000);
                yield return i;
            }
        }
        IObservable<int> AsyncItem2() {
            var x = Observable.Create<int>(
                async o => {
                    await foreach (var item in AsyncItem()) {
                        o.OnNext(item);
                    }
                    o.OnCompleted();
                    return Disposable.Empty;
                }
            );
            return x;
        }
    }
}

首先说一下和定时器的区别

其实刚接触这个概念的时候是不好区分的,现在我也初学也说不太清楚,不过,定时器,是对一个周期执行的任务进行的封装,强调任务,而Rx强调的是数据,只不过,这是和时间有关的数据,

感觉和异步流概念重合了,Rx代表的是一个集合,和普通集合的区别在于,它可以用在和时间有关的场合,做实时的东西

和IEnumerable,IQueryable一样,IObservable也是可Linq的,即它也实现了 Linq那一些扩展方法

IEnumerable<T>,是个迭代器,来源于迭代器模式,好象数据结构里的 链表一样,

IQueryable<T> 是一个表达式树,将一系列linq相关的扩展方法,翻译成Expression 以记录这个linq或扩展方法链式调用的关系,linq就是一系列方法调用的链条,记录以后,在根据需要,解释成不同的

异类表达,比如ToSql就是解释为,t-sql语句,ToOData,就可能解释为,url 的一种地址 等

而 IObservable<T> 让我们觉得呀,这样也可以linq啊,还真是稀奇了。

因为它也是一个集合,所以和IEnumerable 的确非常象,区别仅仅是 它和实时性有关吧。目前我暂时就是这么理解的。如果你觉得不对欢迎留言讨论!

原文地址:https://www.cnblogs.com/ProjectDD/p/11706619.html