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));
    }
}
相关推荐
大今野1 小时前
python习题练习
开发语言·python
爱编程的鱼1 小时前
javascript用来干嘛的?赋予网站灵魂的语言
开发语言·javascript·ecmascript
捕鲸叉2 小时前
C++设计模式和编程框架两种设计元素的比较与相互关系
开发语言·c++·设计模式
未知陨落3 小时前
数据结构——二叉搜索树
开发语言·数据结构·c++·二叉搜索树
大波V53 小时前
设计模式-参考的雷丰阳老师直播课
java·开发语言·设计模式
无敌最俊朗@3 小时前
unity3d————接口基础知识点
开发语言·c#
一丝晨光3 小时前
gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?
c语言·开发语言·c++·gnu·clang·gcc·g++
南城花随雪。3 小时前
Spring框架之装饰者模式 (Decorator Pattern)
java·开发语言·装饰器模式
究极无敌暴龙战神X4 小时前
前端学习之ES6+
开发语言·javascript·ecmascript
虞书欣的64 小时前
Python小游戏24——小恐龙躲避游戏
开发语言·python·游戏·小程序·pygame