Скажем, я хочу создать асинхронный поток случайных чисел, который выкачивает новое значение каждые 100 миллисекунд. Пытаясь придумать решение, моя первая попытка выглядела примерно так:
var random = new Random();
Observable.Start(() => random.Next())
.Delay(TimeSpan.FromMilliseconds(100))
.Repeat()
.Subscribe(Console.WriteLine);
Если вы попытаетесь запустить это, вы заметите, что он постоянно повторяет одно и то же значение снова и снова. Хорошо, я думаю, я неправильно понял, как работает Repeat. Поиграв немного, я придумал это, и это сработало:
var random = new Random();
Observable.Defer(()=> Observable.Start(() => random.Next()))
.Delay(TimeSpan.FromMilliseconds(100))
.Repeat()
.Subscribe(Console.WriteLine);
Итак, я пошел в документацию MSDN, чтобы понять, что делает Дефер, и вот что он говорит:
Возвращает наблюдаемую последовательность, которая вызывает наблюдаемый factoryкаждый раз, когда подписывается новый наблюдатель.
Я предполагаю, что моя путаница такова: в моем примере кода я только когда-либо подписываюсь на Observable один раз, так почему это, похоже, снова и снова вызывает Observable.Start(...)
? Или я недопонимаю Repeat()
? Любое уточнение было бы удивительным.