Как создать IObservable <T>, который возвращает значение каждые -n- секунд, не пропуская - PullRequest
2 голосов
/ 05 октября 2010

Этот пример, приведенный ниже, был моей попыткой сделать это:

var source
    = Observable.Sample(
          Observable.Range(1, int.MaxValue), TimeSpan.FromSeconds(2));

Но когда я .Subscribe () для этого Observable и выводил его на консоль, он показывает последовательность, подобную этой, по одной строке каждый2 секунды:

OnNext: 312969
OnNext: 584486
OnNext: 862009

Очевидно, что наблюдаемая .Range () работает, а наблюдаемая .Sample () ожидает 2 секунды между каждым выходом.Я хотел бы знать, как создать наблюдаемую, но это не позволяет пропускать значения, поэтому очевидно, что это будет выглядеть так:

OnNext: 1
OnNext: 2
OnNext: 3

С одним значением из .Range () выводится каждые 2 секунды.Как я могу сделать это в Reactive Extensions для .NET?

Ответы [ 2 ]

5 голосов
/ 05 октября 2010

Использование Observable.GenerateWithTime:

var source = Observable.GenerateWithTime(1, _ => true, x => ++x, x => x, x => TimeSpan.FromSeconds(2));

Observable.Range использует Observable.Generate, так что это один из подходов.Там может быть много других способов.

Для чего-то более продвинутого, например, для работы с событиями таким же образом (поскольку это, очевидно, поможет, только если вы сами генерируете данные), см. Как регулировать событиепоток с использованием RX? , который решает эту проблему и был решен.

4 голосов
/ 05 октября 2010

Я недавно подошел к этому, создав Observable, который генерирует события по времени каждые timeInterval.Затем вы можете использовать метод Zip для синхронизации событий из вашего Observable с событиями таймера Observable.

Например:

    var timer = 
        Observable
            .Timer(
                TimeSpan.FromSeconds(0), 
                TimeSpan.FromSeconds(2)
            );
    var source = Observable.Range(1, int.MaxValue);
    var timedSource = source.Zip(timer,(s,t)=>s);
    timedSource.Subscribe(Console.WriteLine);
...