0

私はRxについて学ぶ初期段階にあり、Subjectクラスに出くわしました。このクラスが存在する理由がよくわかりません。IObservableとIObserverの両方を実装していることは理解していますが、Subjectは何に使用されますか?

私が知る限り、それらはソースと多数のサブスクライバーの間のプロキシとして機能できますが、サブスクライバーはソースに直接サブスクライブすることはできませんか?サブジェクトのインスタンスがオブザーバブルおよびオブザーバーとして使用されているのを見ると、混乱します。

私はここでいくつかの基本的な事実を理解していないと確信していますが、Subjectがゲームに何をもたらすのかわかりません。サブジェクトが役立つ場合と役に立たない場合の基本的な(しかし、できれば現実の)例を探していると思います(サブジェクトは通常使用されないため、Observable.Createに置き換えられます)。

4

2 に答える 2

1

まず、 Rx フレームワークの他の信条/パターンに反するため、多くの人はあなたが所属Subject<T> していないと言うでしょう。

とは言っても、それらは または のいずれかとしてIObservable機能IObserverするため、それらからいくつかの便利な機能を得ることができます。私は通常、開発の初期段階で次の目的で使用します。

  • 一種の「デバッグ ポイント」です。ここでは、IObservableインライン チェーンをサブスクライブしSubject<T>、デバッガーで内容を検査できます。

  • OnNextストリームに注入したいデータを手動で呼び出して渡すことができる「オブザーバブル オンデマンド」

  • それらを使用して、ConnectableObserable現在の機能を複製するために使用されていました-複数のサブスクライバーが単一の に「ブロードキャスト」メカニズムですObservableが、これは今では実行できますPublish

  • 異種システム間のブリッジレイヤー。FromAsync繰り返しますが、これは現在、さまざまな,拡張機能ではほとんど不要ですがFromEvent、そのままでも使用できます (基本的に、「古い」システムはイベントをSubject<T>ビアOnNextに挿入し、それから通常の Rx フローに挿入します。

于 2013-01-31T22:41:55.403 に答える
0

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

サブジェクトに対する 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"); 
});
}
于 2015-06-28T13:10:13.067 に答える