2010-12-08 10 views
1

私は非同期メソッドを呼び出すためにリアクティブな拡張機能を使用しています。IObservableを作成し、キャッシュされた非同期操作の結果をすぐに返します。

Observableインスタンスを作成して返し、サブスクリプションに必要なデータ(cacheResult)を提供するにはどうすればよいですか?

public IObservable<Bar> GetBars(int pageIndex, int pageSize) 
{ 
    var @params = new object[] { pageIndex, pageSize }; 
    var cachedResult = _cache.Get(@params); 
    if (cachedResult != null) 
    { 
// How do I create a Observable instance and return the 'cacheResult'... 
return ... 
    } 

    var observable = new BaseObservable<Bar>(); 
    _components.WithSsoToken(_configuration.SsoToken) 
     .Get(@params) 
     .Select(Map) 
     .Subscribe(c => 
        { 
          _cache.Add(@params, c); 
          observable.Publish(c); 
          observable.Completed(); 
        }, exception => 
        { 
         observable.Failed(exception); 
         observable.Completed(); 
        }); 

     return observable; 
} 

答えて

3

私はあなたがObservable.Returnを探していると信じて:

return Observable.Return((Bar)cachedResult); 

無関係な注記で:

  • BaseObservable<T>を返す必要はありません。あなたの実装は何をしているのですが、スレッドセーフであるのでSubject<T>を返さなければなりません(戻り値に.AsObservable()を呼び出すと、キャストバックできません)。あなたがキャッシュに値を追加するDoを使用

var observable = new Subject<Bar>(); 
_components.WithSsoToken(_configuration.SsoToken) 
    .Get(@params) 
    .Select(Map) 
    .Subscribe(c => 
    { 
     _cache.Add(@params, c); 
     observable.OnNext(c); 
     observable.OnCompleted(); 
    }, exception => 
    { 
     observable.OnError(exception); 
    }); 

return observable.AsObservable(); 
+0

回答とすべての情報 – AwkwardCoder

2

便利なことに、私はそれをチェックアウトし、あなたのためにこのパターンを行うクラスを書きました:

https://github.com/xpaulbettsx/ReactiveXaml/blob/master/ReactiveXaml/ObservableAsyncMRUCache.cs

var cache = new ObservableAsyncMRUCache<int, int>(
    x => Observable.Return(x*10).Delay(1000) /* Return an IObservable here */, 
    100 /*items to cache*/, 
    5 /* max in-flight, important for web calls */ 
    ); 

IObservable<int> futureResult = cache.AsyncGet(10); 

futureResult.Subscribe(Console.WriteLine); 
>>> 100 

それが正しく処理するいくつかのトリッキーな事柄:

  • それはこれ以上n以下の項目が同じで実行されていることを保証し、最後のn個のアイテムをキャッシュし、
  • を使用されていないアイテムを捨てますあなたがこれをしないと、キャッシュが空であれば簡単に何千ものWeb呼び出しを生成することができます
  • 同じ項目を連続して2回要求すると、最初の要求で要求が開始され、呼び出しは同じ要求を生成するのではなく、最初の呼び出しを待機するため、データの重複を終了することはありません。
関連する問題