Rx.Net 第四章

哇,你在这一章学到了很多。你应该为自己感到骄傲。本章所涵盖的内容几乎会在你创建的每个可观察对象管道中用到:所有可观察对象都实现IObservable接口。

不鼓励通过手动实现IObservables接口来创建可观察对象。相反,使用一个内置的创建操作符。

Create操作符允许您通过传递Subscribe方法来创建可观察对象,该方法将为订阅的每个观察者运行。

Defer操作符允许您推迟或延迟可观察对象的创建,直到观察者订阅序列的时候。

要从符合事件模式的事件中创建一个可观察对象(使用的委托接收一个sender和EventArgs),请使用FromEventPattern操作符。

要转换不符合事件模式的事件,请使用FromEvent操作符。

FromEventPattern和FromEvent操作符接收一个向事件添加事件处理程序的函数和一个从事件中删除事件处理程序的函数。

您可以使用FromEventPattern操作符的重载,它允许您传递一个对象并指定要从中创建可观察对象的事件的名称。这应该主要用于标准框架事件。

Enumerables也可以通过ToObservable操作符转换为可观察对象。

可观察对象可以通过操作符ToEnumerable、ToList、ToDictionary和tollookup转换为可枚举对象。但是它们会导致消费代码阻塞,直到一个项目可用,或者直到整个可观察对象完成,这取决于操作符。

要从迭代过程中创建一个可观察对象,请使用Generate操作符。

Range操作符创建一个可观察对象,该对象发出指定范围内的数字序列。

要创建一个只发出一个通知的可观察对象,可以使用observable . return操作符。

要创建一个从不发出通知的可观察对象,可以使用observable . never操作符。

要创建一个通知失败的可观察对象,请使用observable。把操作符。

要创建一个空的可观察对象,使用observable。空符。

尽管如此,在本章中,我们忽略了封装异步执行的重要类型。下一章将扩展你关于创建可观察对象的知识。

您将了解。net中的异步模式以及如何将它们连接到Rx中。

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Text;
using System.Threading.Channels;
using System.Threading.Tasks;

namespace ReactiveDemo;

internal class ConcatTest
{
    internal static void Run()
    {
        var obserOne = Enumerable.Range(1, 10).ToObservable();
        var obserTwo = Observable.Create<int>(async obs =>
        {
            for (int i = 300; i < 310; i++)
            {
                await Task.Delay(1000);
                obs.OnNext(i);
            }
            obs.OnCompleted();
            return Disposable.Empty;
        });
        var obsSum = obserOne.Concat(obserTwo);
        var subs = obsSum.Subscribe(data => Console.WriteLine(data));
        subs.Dispose();

        //字符串示例
        var observable = Observable.Create<string>(o =>
        {
            o.OnNext("Observable");
            o.OnNext("To");
            o.OnNext("Enumerate");
            o.OnCompleted();
            return Disposable.Empty;
        });
        var enumerable = observable.ToEnumerable();
        foreach (var item in enumerable)
        {
            Console.WriteLine(item);
        }


        //打开文件示例
        var observableLine = Observable.Using(
            () => File.OpenText("demo.txt"),
            stream => Observable.Generate(stream,
                                          s => !s.EndOfStream,
                                          s => s,
                                          s => s.ReadLine())

            );

        var subLine = observableLine.Subscribe(data => Console.WriteLine(data));
        subLine.Dispose();

        //不常用的基础用法
        Observable.Return("Hello World").Subscribe(data => Console.WriteLine(data));

        Observable.Never<string>().Subscribe(data => Console.WriteLine(data));

        Observable.Throw<ApplicationException>(new ApplicationException("something bad happened")).Subscribe(data => Console.WriteLine(data));

        Observable.Empty<string>().Subscribe(data => Console.WriteLine(data));
    }
}
相关推荐
Evand J2 小时前
【自适应IMM】MATLAB编写的创新多模型,基于CA/CT双模型和观测自适应。二维平面目标位置估计,带误差统计特性输出,附代码下载链接
开发语言·matlab·ekf·imm·交互式多模型
我命由我123452 小时前
微信小程序 - scroll-view 的一些要点(scroll-view 需要设置滚动方向、scroll-view 需要设置高度)
开发语言·前端·javascript·微信小程序·小程序·前端框架·js
7哥♡ۣۖᝰꫛꫀꪝۣℋ2 小时前
Spring IoC&DI
java·开发语言·mysql
wadesir2 小时前
Go语言反射之结构体的深比较(详解reflect.DeepEqual在结构体比较中的应用)
开发语言·后端·golang
你不是我我2 小时前
【Java 开发日记】我们来说一说 Redis IO 多路复用模型
java·开发语言·redis
想七想八不如114082 小时前
408操作系统 PV专题
开发语言·算法
浩瀚地学2 小时前
【Java】ArrayList
java·开发语言·经验分享·笔记
阿杰同学2 小时前
Java 设计模式 面试题及答案整理,最新面试题
java·开发语言·设计模式
这样の我2 小时前
java 模拟chrome指纹 处理tls extension顺序
java·开发语言·chrome