【发布时间】:2016-12-30 23:36:59
【问题描述】:
在了解 Rx 的过程中,我遇到了一个经常重复的关于 Observables 的规则,在 The Observable Contract 中有详细说明。
在发出 OnCompleted 或 OnError 通知后,它可能不会再发出任何进一步的通知。
这对我来说很有意义,因为让 Observable 在完成后继续产生值会令人困惑,但是当我在 .NET 中测试 Observable.Range 方法时,我注意到它没有表现出这种行为,事实上很多 Observables 违反了这条规则。
var rangeObservable = Observable.Range(0, 5);
rangeObservable.Subscribe(Console.WriteLine, () => Console.WriteLine("Done first!"));
Console.ReadLine();
rangeObservable.Subscribe(Console.WriteLine, () => Console.WriteLine("Done second!"));
Console.ReadLine();
//Output:
//0
//1
//2
//3
//4
//Done first!
//0
//1
//2
//3
//4
//Done second!
显然rangeObservable 调用了两次OnComplete 并在第一次OnComplete 之后产生了值。这让我相信这不是关于 Observables 的规则,而是关于 Subscriptions 的规则。也就是说,一个 Observable 可以产生任意多的终止消息,甚至在它产生之后产生值,只要每个 Subscription 只接收一个终止消息并且没有收到之后的进一步消息。
当它说 Observable 时,它们实际上是指 Subscription 吗?它们真的是不同的东西吗?我对模型有根本的误解吗?
【问题讨论】:
标签: c# system.reactive reactive-programming observable reactive