3

設定:

  • 最初IObservableに型A の値を生成します
  • 2 番目IObservableは型Bの値を生成します
  • それらは異なるペースで価値を生み出します(非常に速く、最大10ミリ秒ごと)

私が達成しようとしていること:

N回 (N は約 500 ミリ秒と非常に遅い)ごとに、サービスに対して呼び出しを実行し、 FirstSecond IObservableの両方から最新の値を提供する必要があります。

質問: RX を使用してどのようにすればよいでしょうか。

現在の解決策(機能していない)

var stateObs = from drag in dragObs.MostRecent(0).ToObservable()
                from roll in rollObs.MostRecent(0).ToObservable()
                select new ClientState
                            {
                                FileDragPerc = drag,
                                PhoneRoll = roll,
                                PendingFileType = FileType.Image,
                                TransferState = TransferState.SelectiveTransfer
                            };

stateObs.Sample(TimeSpan.FromMilliseconds(300))
        .Subscribe(x => _lsService.SetClientStateAsync(x),
                    x => Debug.WriteLine("Error in observable "),
                    () => Debug.WriteLine("Error observable finished! "));
4

2 に答える 2

2

あなたは正しいです。それがCombineLatestオペレーターのすることです:

A: 1...2...3...4...5...

B: a.....b.........c...

いずれかのシーケンスの最後の値が保持され、セレクターが作用するペアが生成されます。出力ストリームは次のようになります(1,a) (2,a) (2,b) (3,b)

いずれかのストリームから適切なペアを構築する必要がある場合は、「Zip」演算子を使用してください(1,a) (2,b) (3,c)

PS

コンパイラがクエリ内包表記をどのように書き直すかをよりよく理解することをお勧めします。それはあなたの混乱のほとんどを解決します。

from a in oA
from b in oB
select ...

効果的にSelectMany(oA, oB)

于 2012-01-21T18:28:54.713 に答える