我想反复获取属性值并将其分配给另一个属性,但我还没有完成Rx Observable
创建的处理。如何创建和订阅只是不断读取属性的可观察对象(可能是在计时器上还是在节流中)?
答案 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塞进你的投票实施?您是否有其他可在此处同步的可观察数据源?