创建一个可重复调用方法的可观察值

创建一个可重复调用方法的可观察值

问题描述:

我想重复获取属性值并将其分配给另一个属性,但我还没有处理Rx的Observable创建。我如何创建和订阅一个只是不断读取属性的观察值(可能在一个定时器或节流)?创建一个可重复调用方法的可观察值

+0

是否拥有该对象该属性实现'INotifyPropertyChanged'任何机会?这将是解决这个问题的更清洁的方式。 – 2011-04-26 21:00:30

+0

@Richard不,它没有实现INPC。我想到了这一点,但不值得介绍这种行为。 – Pat 2011-04-26 21:02:53

+0

我不同意,但够公平! – 2011-04-27 06:41:45

您可以使用静态Interval运算符在给定的时间间隔内重复发出一个值,然后使用opertor将其转换为您希望轮询的对象上的属性值。

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


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

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

啊,这就是你如何使用'Interval'方法。 – Pat 2011-04-26 21:01:37

+2

您可能想添加DistinctUntilChanged以避免不必要的通知 – Christoph 2011-04-27 05:01:22

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

你为什么试图在你的轮询实施中使用Rx?您是否有其他可观察的数据源,您尝试在此处同步?

+1

我知道rx是'推'而不是'拉',但它似乎比计时器更容易用于轮询。或许我应该用另一种方式来看待它 - 但我可以返回一个可观察对象而不是次要对象的特定属性。 – Pat 2011-04-27 21:16:23

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(()=> CheckForDequeues(1),500);

其实我有时候用长,但大部分的时间,不...

即使使用这种辅助检查调度程序的优先级队列,所以可以用来