2011-02-12 5 views
2

私の意見では、RX関数のかなり良い「感じ」があります。私はそれらの多くを使用しています。 .Prune関数の場所。私はこれがAsyncSubjectへのマルチキャストであることを知っていますが、これが実際のシナリオでどのように役立つのでしょうか?.PublishLast()の使用例(以前はプルーン)

編集:リチャード氏は、WebRequestはPrune()の良い候補だと言います。私はまだどのように表示されません。のは、例を見てみましょう - 私は、画像に入ってくるのURIのを変換したい:

public static IObservable<BitmapImage> ToImage(this IObservable<string> source) 
    { 
     var streams = 
      from wc in source.Select(WebRequest.Create) 
      from s in Observable 
       .FromAsyncPattern<WebResponse>(wc.BeginGetResponse, 
        wc.EndGetResponse)() 
       .Catch(Observable.Empty<WebResponse>()) 
      select s.GetResponseStream(); 
     return streams 
      .ObserveOnDispatcher() 
      .Select(x => 
         { 
          var bmp = new BitmapImage(); 
          bmp.SetSource(x); 
          return bmp; 
         }); 
    } 

あなたは(熱い)FromAsyncPattern()を呼び出しているときので、私は、.FromAsyncPatternに.Pruneを追加することが必要で表示されませんあなたは「即座に」購読します。

+4

プルーン?キューにバックログがある場合;) –

答えて

2

was confirmed on the RX Forumプルーンは単なる演算子です。あなたの観察可能な、単一の値を持っており、あなたはそれを公開している場合

、.Prune()私の経験からそう

に1回の呼び出しで\接続を公開置き換えることができ、プルーンのための最も一般的なシナリオは次のとおりです。

  • あなたは副作用を生成し、あなたはその観測可能な1人の加入者よりも多くを持っているので、あなたが(理由は副作用の)それがホットにしたい一つの値だけ
  • を発すること寒さに観察を持って

フォーラムで指摘されているもう1つは、熱い観測可能なもの(通常は最初のもの)に特定の値をキャッシュする必要があるときです。次に、FromEvent(...)を使用します。Take(1).Prune()とこれを購読する人は、同じ値が保証されます。これは単なる「利便性」ではなく、結果を達成するための唯一の簡単な方法です。

かなり便利です。

2

最も一般的なシナリオは、ソースオブザーバブルが熱くなっており、購読する前に完了することができる場合です。 AsyncSubjectは最後の値を取得し、将来のサブスクライバに再発行します。

編集

私がチェックする必要があると思いますが、私はFromAsyncPatternが内部AsyncSubjectを使用するため、実際にはすでに「剪定」されると信じています。

しかし、あなたはしなかった他のいくつかのホットソースを使用していたと仮定すると、Pruneの使用は、それがサブスクライブされている前IObservableの寿命に完全にダウンしています。あなたが即座にそれを購読すれば、Pruneの必要はありません。ただし、登録する前にしばらくの間、IObservableが存在する場合、すでに完了している可能性があります。

これは私の理解であり、Rxを移植したことがありますが、決してPruneを使用したことはありません。あなたはRx forumsで同じ質問をするべきでしょうか?あなたはRxチームの誰かがそれに答える機会があります。

+0

何とか私のシナリオでは、コンテナが破壊されるまで熱い観測可能物が走っています。 私は質問を「私に熱い観察可能なものの最後の価値が必要なときに私に仕事の例(ウェブリクエスト、UI相互作用など)を与える」と言い換えることができます。 –

+0

あなた自身が言っているように、WebリクエストはPruneの完璧な状況です。 –

+0

私の編集を参照してください。具体的なコード例でWHYを説明できますか?あなたがプルーンをここに入れないと、この悪いことが起こるかもしれない "のように。 –

1

タスク(コールバックなど)を聴く必要がある複数のUIコンポーネントがあり、デフォルトでは、寒冷観測でSubscribe()がいくつかのタスクを開始するときに、 UIコンポーネント間で状態を共有するときには、通常は必要ではありません。

私はリチャードがこれらの点を多く指摘していることを知っていますが、この例を追加するには、これは単発タスクのための完全な候補であると考えました。

var oTask = Observable.FromAsync(() => Task.Factory.StartNew(() => 
                  { 
           Thread.Sleep(1000); 
           Console.WriteLine("Executed Task"); 
                  })); 

//Setup the IConnectedObservable 
var oTask2 = oTask.PublishLast(); 

//Subscribe - nothing happens 
oTask2.Subscribe(x => { Console.WriteLine("Called from Task 1"); }); 
oTask2.Subscribe(x => { Console.WriteLine("Called from Task 2"); }); 

//The one and only time the Task is run 
oTask2.Connect(); 

//Subscribe after the task is already complete - we want the results 
Thread.Sleep(5000); 
oTask2.Subscribe(x => { Console.WriteLine("Called from Task 3"); }); 
+0

これは私の答えに記載されているのと同じシナリオだと思いますか? –

関連する問題