创建一个可重复调用方法的可观察值
我想重复获取属性值并将其分配给另一个属性,但我还没有处理Rx的Observable
创建。我如何创建和订阅一个只是不断读取属性的观察值(可能在一个定时器或节流)?创建一个可重复调用方法的可观察值
您可以使用静态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));
这听起来像你本质上要求轮询实现,其中一些组件轮询改变的值。观察对象通常用于对推送给你的对象(通过事件/可观察对象/等)作出反应,而不是拉取值。也许只是在一个定时器上设置一个后台进程并在该定时器的Tick上运行对于你的情况就足够了。 Observable.Interval的行为与James Hay提到的类似。请注意,Observable.Interval会将您的执行环境移出调度程序线程。
你为什么试图在你的轮询实施中使用Rx?您是否有其他可观察的数据源,您尝试在此处同步?
我知道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);
其实我有时候用长,但大部分的时间,不...
即使使用这种辅助检查调度程序的优先级队列,所以可以用来
是否拥有该对象该属性实现'INotifyPropertyChanged'任何机会?这将是解决这个问题的更清洁的方式。 – 2011-04-26 21:00:30
@Richard不,它没有实现INPC。我想到了这一点,但不值得介绍这种行为。 – Pat 2011-04-26 21:02:53
我不同意,但够公平! – 2011-04-27 06:41:45