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 分钟前
如何创建一个PR
运维·开发语言·windows·git·docker·容器
C++ 老炮儿的技术栈5 分钟前
VS2015 + Qt 实现图形化Hello World(详细步骤)
c语言·开发语言·c++·windows·qt
派葛穆11 分钟前
Python-批量安装依赖
开发语言·python
波波00713 分钟前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
MSTcheng.23 分钟前
【C++】C++11新特性(二)
java·开发语言·c++·c++11
晓131326 分钟前
第七章 【C语言篇:文件】 文件全面解析
linux·c语言·开发语言
愚者游世26 分钟前
Delegating Constructor(委托构造函数)各版本异同
开发语言·c++·程序人生·面试·改行学it
梵刹古音29 分钟前
【C语言】 指针基础与定义
c语言·开发语言·算法
Ekehlaft32 分钟前
这款国产 AI,让 Python 小白也能玩转编程
开发语言·人工智能·python·ai·aipy
rit843249934 分钟前
MATLAB中Teager能量算子提取与解调信号的实现
开发语言·matlab