哇,你在这一章学到了很多。你应该为自己感到骄傲。本章所涵盖的内容几乎会在你创建的每个可观察对象管道中用到:所有可观察对象都实现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));
}
}