使用主题意味着我们现在正在管理状态,这可能会发生变化。变异状态和异步编程很难做到正确。此外,许多运算符(扩展方法)都经过精心编写,以确保订阅和序列的正确和一致的生命周期得以维持。当你介绍主题时,你可以打破这一点。
Create 方法相对于主题的一个显着好处是序列将被延迟评估。
在这个例子中,我们展示了我们如何首先通过标准阻塞热切评估调用返回一个序列,然后我们展示了返回一个可观察序列而不通过延迟评估阻塞的正确方法。
下面的示例将在他们收到 IObservable 之前被阻止至少 1 秒,无论他们是否确实订阅了它。
private IObservable<string> BlockingMethod()
{
var subject = new ReplaySubject<string>();
subject.OnNext("a");
subject.OnNext("b");
subject.OnCompleted();
Thread.Sleep(1000);
return subject;
}
在 bleow 示例中,消费者立即收到 IObservable,并且只有在订阅时才会产生线程休眠的成本。
private IObservable<string> NonBlocking()
{
return Observable.Create<string>(
(IObserver<string> observer) =>
{
observer.OnNext("a");
observer.OnNext("b");
observer.OnCompleted();
Thread.Sleep(1000);
return Disposable.Create(() => Console.WriteLine("Observer has unsubscribed"));
//or can return an Action like
//return () => Console.WriteLine("Observer has unsubscribed");
});
}