0

アイテムをキャッシュできるシーケンス ( ) を作成したいObservable<T>ので、パイプライン内の計算は 1 回だけ処理されます。例えば:

var obs = Observable
.Range(1, 100)
.SelectMany(x => GetItemAsync(x));

2 つのサブスクライバーがあり、GetItemAsync の結果がキャッシュされ、2 番目のサブスクライバーがキャッシュされた値から結果を取得するようにしたいので、後続のサブスクリプションに対してメソッドをまったく呼び出さないようにします。

似たようなことをしたいのですLazy<T>が、Reactive Extensions を使用します

4

1 に答える 1

2

Replay演算子は、追加のメソッドを持つを返しIConnectableObservable<T>ます。このオブザーバブルは、任意の数のオブザーバーがサブスクライブできます。接続された時点から切断された時点まで、基礎となるオブザーバブルからの過去および将来のすべての通知をすべてのオブザーバーに伝播します。次に例を示します。IObservable<T>Connect

var connectable = Observable
    .Range(1, 100)
    .SelectMany(x => GetItemAsync(x))
    .Replay();

var subscription1 = connectable.Subscribe(x => Console.WriteLine(x))
var subscription2 = connectable.Subscribe(x => Console.WriteLine(x))

var connection = connectable.Connect(); // Subscribe to the 'SelectMany' observable

//...

connection.Dispose() // Unsubscribe from the 'SelectMany' observable

この例は、基礎となるオブザーバブルに手動で接続する方法を示しています。これは、Publish. しかしReplay、リプレイ機能があるため、オペレーターではそれほど重要ではありません。基になるオブザーバブルに接続する前または後にサブスクライブするかどうかは問題ではありません。そのため、手動で接続することを避け、利用可能な 2 つの自動接続演算子のいずれかを使用することを選択できます。

  1. RefCount: 基礎となるオブザーバブルが初めてサブスクライブされたときに接続し、最後のサブスクライバーがサブスクライブを解除すると切断します。

  2. AutoConnect(0): 基礎となるオブザーバブルにすぐに接続し、永久に接続されたままになります。

例:

var observable = Observable
    .Range(1, 100)
    .SelectMany(x => GetItemAsync(x))
    .Replay()
    .AutoConnect(0);

// call observable.Subscribe any time and as many times you want

RefCount基になるオブザーバブルが正常に完了するか、エラーが発生した場合、との両方AutoConnectが自動的に切断されます。

複数回の接続と切断はサポートされていないシナリオであり、予期しない結果が生じる可能性があります。Replay切断して再接続する場合は、毎回別の接続可能オブジェクトを使用することをお勧めします。

于 2021-01-06T21:17:34.693 に答える