【问题标题】:How to impelment dynamic time interval in Reactive Extension如何在 Reactive Extension 中实现动态时间间隔
【发布时间】:2015-08-20 15:04:30
【问题描述】:

我有一个场景,每次滴答事件都会更改计时器间隔。如下代码所示:

    Timer tmrObj = new Timer();
    tmrObj.Interval = TimeSpan.FromSeconds(11);
    tmrObj.Tick += TimerTickHandler;

   public void TimerTickHandler(EventArg arg)
   {
     tmrObj.pause();

     var response = MakeSomeServiceCall();
     tmr.Interval = response.Interval;

     tmrObj.resume();
   }

如果我需要在 Rx 中实现相同的计时器。我可以使用 Timer 功能来实现。但是,如上面的代码所示,我怎样才能在事件刻度上操作间隔。当前的定时器间隔实现如下:

var serviceCall = Observable.FromAsync<DataResponse>(MakeServiceCall);
var timerCall = Observable.Timer(TimeSpan.FromSeconds(100));

var response = from timer in timerCall
               from reponse in serviceCall.TakeUntil(timerCall)
               .Select(result => result); 

【问题讨论】:

    标签: c# timer system.reactive reactive-programming


    【解决方案1】:

    如果是非异步生成,您可以使用Generate 来处理数据生成。如果您的方法将使用异步,尽管您可以推出自己的 GenerateAsync 方法:

    public static IObservable<TOut> GenerateAsync<TResult, TOut>(
        Func<Task<TResult>> initialState,
        Func<TResult, bool> condition,
        Func<TResult, Task<TResult>> iterate,
        Func<TResult, TimeSpan> timeSelector,
        Func<TResult, TOut> resultSelector,
        IScheduler scheduler = null) 
    {
      var s = scheduler ?? Scheduler.Default;
    
      return Observable.Create<TOut>(async obs => {
    
        //You have to do your initial time delay here.
        var init = await initialState();
        return s.Schedule(init, timeSelector(init), async (state, recurse) => 
        {
          //Check if we are done
          if (!condition(state))
          {
            obs.OnCompleted();
            return;
          }
    
          //Process the result
          obs.OnNext(resultSelector(state));
    
          //Initiate the next request
          state = await iterate(state);
    
          //Recursively schedule again
          recurse(state, timeSelector(state));
    
        });
      });
    }
    

    original answer

    你可以这样使用它:

    var timeStream = ObservableStatic.GenerateAsync(
      () => MakeServiceCall(),
      _ => true,
      _ => MakeServiceCall(),
      result => result.Interval,
      _ => _);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 2020-01-31
      • 2012-06-24
      • 1970-01-01
      • 2016-05-28
      相关资源
      最近更新 更多