サブジェクトを使用するということは、潜在的に変化する状態を管理していることを意味します。状態の変更と非同期プログラミングを正しく行うのは非常に困難です。さらに、多くの演算子 (拡張メソッド) は、サブスクリプションとシーケンスの正確で一貫した有効期間が維持されるように注意深く記述されています。科目を導入すると、これを破ることができます。
サブジェクトに対する 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;
}
以下の例のように、コンシューマーはすぐに 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");
});
}