创建一个反复调用方法的observable

时间:2011-04-26 20:25:03

标签: .net system.reactive

我想反复获取属性值并将其分配给另一个属性,但我还没有完成Rx Observable创建的处理。如何创建和订阅只是不断读取属性的可观察对象(可能是在计时器上还是在节流中)?

3 个答案:

答案 0 :(得分:9)

您可以使用静态Interval运算符在给定时间范围内重复发出值,然后使用Select opertor将其转换为您要轮询的对象的属性值。 / p>

var objectIWantToPoll = new MyObject(); 
var objectIWantToSetPropertyOn = new MyObject();


var polledValues =  Observable.Interval(TimeSpan.FromSeconds(1)) 
   .Select(_ => objectIWantToPoll.SomeProperty);

polledValues.Subscribe(propertyValue => 
   objectIWantToSetPropertyOn.SomeProperty = propertyValue));

答案 1 :(得分:1)

public static IObservable<long> CreateObservableTimerWithAction(this Action actionT, int timeSpan, Control control)
    {
        var obs = Observable.Create<long>(
             observer =>
             {
                 Observable.Interval(TimeSpan.FromMilliseconds(timeSpan))
.DistinctUntilChanged(fg =>control.Text ).Subscribe(l => actionT());
                 return Disposable.Empty;
             });

        return obs;
    }

0r:

public static IObservable<long> CreateObservableTimer<T>(this Action actionT,int timeSpan)
    {
       var obs= Observable.Create<long>(
            observer =>
            { 
                Observable.Interval(TimeSpan.FromMilliseconds(timeSpan))
.DistinctUntilChanged().Subscribe(l => actionT());
                return Disposable.Empty;
            });
        return obs;
    }

我经常使用这个,定时方法在某个时间进行,直到我处理它们(obs.Dispose())..

CreateObservableTimer(()=&gt; CheckForDequeues(1),500);

我实际上有时使用很长时间,但大部分时间都没有...

甚至使用此帮助程序检查优先级队列中的Scheduler,因此可以用于

答案 2 :(得分:0)

听起来你基本上要求一个轮询实现,其中一些组件轮询更改的值。 Observable通常用于对推送给您的对象(通过事件/可观察对象等)做出反应,而不是提取值。也许只是在计时器上设置后台进程并对该计时器的Tick进行操作就足够了。 Observable.Interval的行为与James Hay提到的相似。请注意,Observable.Interval会将执行上下文移出调度程序线程。

你为什么试图将Rx塞进你的投票实施?您是否有其他可在此处同步的可观察数据源?