IObservable.Generate для переменного интервала - PullRequest
0 голосов
/ 02 июня 2018

Я очень новичок в использовании System.Reactive и спрашиваю, можно ли улучшить мое решение.Мне нужно подписаться на бесконечный набор событий с интервалами, определенными предыдущим событием.Я видел другие решения, использующие IObservable.Generate, и нашел следующее, которое работает, но это хорошая практика?

IDisposable updateJob = Observable.Generate(
    true,
    _ => true,
    _ => CheckForUpdate(),
    _ => _, 
    _ => NextCheck()).Subscribe();

Где NextCheck() возвращает TimeSpan, а CheckForUpdate() возвращает bool и выполняет обработку события.

1 Ответ

0 голосов
/ 03 июня 2018

С одной стороны, если это работает ... пожимает плечами .С другой стороны ...

Observable.Generate должно быть похоже на цикл for со встроенными необязательными временными интервалами. Так что если вы хотите перебирать целые числа 1-10, приостанавливая i * 100 миллисекунд между каждой итерацией, вы должны сделать следующее:

var forLoop = Observable.Generate(
    1,
    i => i <= 10,
    i => i + 1,
    i => i,
    i => TimeSpan.FromMilliseconds(i * 100)
)

Приятно то, что Rx управляет состоянием итератора для вас, и вы можете видеть все это.Вы также можете добиться того же эффекта с помощью чего-то подобного:

var opaqueForLoop = Observable.Generate(
    GetFirstValue(),
    _ => CheckIfDone(),
    _ => GetNextValue(),
    i => SaveCurrentValue(i),
    _ => GetNextTimespan()
)

Но вам придется реализовать эти методы, и у вас будет немного ненужных спагетти.

Ваш код больше похож напоследний, чем первый.Это может быть необходимо, в зависимости от вашей проблемы, я действительно понятия не имею.

Единственное, что вы можете явно сделать, это заменить тип итератора на Unit и значение на Unit.Default.Поскольку вы вообще не используете это значение, вы можете использовать явно бесполезное значение, чтобы прояснить это.

...