在同时收听时定期调用订阅内的函数

时间:2017-05-10 07:29:50

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

请原谅我无知,但我对Reactive扩展有一点经验。我想要的是这样的:

myObservable.Do(d => myObserver.OnNext(d)).Interval(someTime).subscribe({ Run the this code periodically with period T=sometime});

口头上,给定一个可以随时发出项目的观察者,需要将这些项目连续地送入观察者并且每个时间段T调用subscribe内的函数。只需提及此函数即可调用myObserver内的一些函数。以上代码段不起作用。它说myObservable不包含Interval的定义。你能否对这种情况有所了解?

编辑:观察者,处理传入的项目。因此,我想要的是一直倾听,并且每T调用一个开始和停止过程。这个过程必须收集物品并存储它们。有一些开始和停止memorystream。因此,在第一次(StartWith(-1L))中,观察者启动一些处理,并在T秒之后停止该过程。此启动和停止循环定期继续。

编辑#2:

我有IObservable<T>发出物品。这些物品由观察员接收。这个观察者可以处理数据。我想要的是定期开始和停止这个过程。这意味着观察者应该始终在t的时间段内接收数据,如果停止则该过程必须开始,如果已经开始/正在运行则必须停止。这个start() stop()函数是观察者的成员,即observer.start()和observer.stop()。此外,观察者内部还有一个标志/布尔值,如果进程正在运行,则为true或false。我认为Interval应该有效,但不适用于IObservable<T>。你能否对这种情况有所了解?

修改#3 由于讨论,我想我找到了我需要的东西。

observable.subscribe(oberver) // observer always listening

TimeSpan someTime = TimeSpan.FromMinutes(1.0);
IObservable<long> myObservable = Observable.Interval(someTime);

myObservable.Subscribe(d =>
    {
       if (!observer.isProcessing)
       {
           observer.Start();

        }else if (observer.isProcessing)
        {
           observer.Stop();

        }
    });

1 个答案:

答案 0 :(得分:2)

IntervalObservable之外的静态方法 - 它不是IObservable<T>接口的一部分。你可以这样使用它:

TimeSpan someTime = TimeSpan.FromMinutes(1.0);
IObservable<long> myObservable = Observable.Interval(someTime);

现在你可以继续编写你想要的代码:

myObservable
    .Do(d => myObserver.OnNext(d))
    .Subscribe(d =>
    {
        //Run the this code periodically with period T=sometime
    });

我不确定你为什么这样打myObserver.OnNext(d)。它看起来有点像代码味道。如果你可以在你的问题中添加更多细节,那么也许我也可以帮助你。