Создайте наблюдаемую, которая многократно вызывает метод - PullRequest
4 голосов
/ 27 апреля 2011

Я хотел бы многократно получать значение свойства и назначать его другому свойству, но у меня пока нет описания процесса создания Observable в Rx. Как мне создать и подписаться на наблюдаемое, которое просто постоянно читает свойство (может быть по таймеру или с регулированием)?

Ответы [ 3 ]

9 голосов
/ 27 апреля 2011

Вы можете использовать статический оператор Interval, чтобы повторно выдавать значение в течение заданного промежутка времени, а затем использовать оператор Select, чтобы преобразовать его в значение свойства объекта, который вы хотите опросить.

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 голос
/ 30 июля 2012
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);

На самом деле я иногда использую long, но чаще всего нет ...

Даже используйте этот помощник для проверки планировщиков в очереди с приоритетами, поэтому его можно использовать для

0 голосов
/ 28 апреля 2011

Похоже, что вы, по сути, запрашиваете реализацию опроса, где некоторые компоненты опрашивают измененные значения. Наблюдаемые, как правило, предназначены для реагирования на объекты, выдвинутые вам (через события / наблюдаемые / и т. Д.), А не для получения значений. Возможно, для вашего случая будет достаточно просто настроить фоновый процесс на таймере и работать на тике этого таймера. Observable.Interval ведет себя так же, как упоминал Джеймс Хей. Помните, что Observable.Interval переместит ваш контекст выполнения из потока диспетчера.

Почему вы пытаетесь вставить Rx в вашу реализацию опроса? Есть ли у вас другие наблюдаемые источники данных, которые вы пытаетесь синхронизировать здесь?

...