延迟函数动态推迟IObservable值

时间:2012-04-09 08:58:15

标签: c# .net datetime delegates system.reactive

[此问题与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"));

虽然变量延迟编译的代码只调用一次,但只提供第一个值(基本上是固定值)。

  • 您如何订阅Reactive Extensions中的动态延迟?

4 个答案:

答案 0 :(得分:2)

看起来.Delay的新重载允许在RX本身内实现此功能:

来自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)));

给定用户输入,它会在几秒钟内获得等于输入长度的持续时间。换句话说,每个元素的延迟现在可以取决于数据本身。

答案 1 :(得分:1)

我认为这有效:

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

如果您的延迟正在减少,则生成的流可能与原始流的顺序不同。

答案 2 :(得分: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();

答案 3 :(得分:0)

如果您想延迟一次,则可以使用Observable.Delay。我不知道结果的类型是什么,所以我认为它已经是一个IObservable了,所以,你可以这样做:

    var Result = Observable.Range(0, 10);
var frequency = TimeSpan.FromMilliseconds(1500);
var delay = Result.Delay(frequency);
delay.Subscribe(x => Debug.WriteLine(x));