3

[この質問はIObservable/Rxに関するものです]

固定遅延の動作

var frequency = TimeSpan.FromMinutes(5);
Result.Delay(frequency).Subscribe(i => Debug.WriteLine("After Fixed Delay"));

可変遅延の擬似コード

Result.Delay(GetAsymptotingTime()).Subscribe(i => Debug.WriteLine("After Changing Delay"));

可変遅延のコードはコンパイル中に1回だけ呼び出され、最初の値(基本的には固定値)のみを提供します。

  • Reactive Extensionsの動的遅延をどのようにサブスクライブできますか?
4

4 に答える 4

3

RX自体の中でこの機能を可能にする.Delayの新しいオーバーロードがあるようです。

http://blogs.msdn.com/b/rxteam/archive/2012/03/12/reactive-extensions-v2-0-beta-available-now.aspxから:

var res = input.Delay(x => Observable.Timer(TimeSpan.FromSeconds(x.Length)));

ユーザー入力が与えられると、秒単位の入力の長さに等しい期間の遅延が発生します。別の言い方をすれば、各要素の遅延はデータ自体に依存するようになりました。

于 2014-03-05T10:52:01.907 に答える
1

私はこれがうまくいくと思います:

source
  .SelectMany(i => Observable.Timer(GetAsymptotingTime()).Select(_=>i))

遅延が減少している場合、結果のストリームは元のストリームとは異なる順序になっている可能性があります。

于 2012-04-10T07:58:07.537 に答える
1

質問が正しくなかったのかもしれませんが、速すぎて来るアイテム間に同じ固定遅延を設定する方法を探していたときに、私はそれに踏み込みました。以前の解決策は私にはうまくいきませんでした、(RX 4.0)実際にはまったく遅延はありませんでした。

私の解決策は簡単です:

myObservable.Zip(Observable.Interval(TimeSpan.FromSeconds(1)), (a, _) => a)

私は次のような動的シーケンスをテストするときに使用しました

      using var d2 = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }
        .ToObservable()
        .Zip(Observable.Interval(TimeSpan.FromSeconds(1)), (a, _) => a)
        .Do(a => Log.Logger.Debug("b {a}", a))
        .Subscribe();
于 2019-10-13T21:52:30.210 に答える
0

一度遅延させたい場合は、Observable.Delayを使用できます。Resultのタイプがわからないので、すでにIObservableであると想定します。したがって、次のようなことができます。

    var Result = Observable.Range(0, 10);
var frequency = TimeSpan.FromMilliseconds(1500);
var delay = Result.Delay(frequency);
delay.Subscribe(x => Debug.WriteLine(x));
于 2012-04-09T16:03:38.147 に答える