Observable.Defer -нужно пояснить, что именно он делает

Скажем, я хочу сгенерировать асинхронный поток случайных чисел, который выдает новое значение каждые 100 миллисекунд. Пока я пытался найти решение, моя первая попытка выглядела примерно так:

        var random = new Random();
        Observable.Start(() => random.Next())
                 .Delay(TimeSpan.FromMilliseconds(100))
                 .Repeat()
                 .Subscribe(Console.WriteLine);

Если вы попытаетесь запустить это, вы заметите, что оно просто продолжает повторять одно и то же значение снова и снова. Хорошо, я думаю, я неправильно понял, как работает повтор. Поиграв немного,Я придумал это, и это сработало:

        var random = new Random();
        Observable.Defer(()=> Observable.Start(() => random.Next()))
                 .Delay(TimeSpan.FromMilliseconds(100))
                 .Repeat()
                 .Subscribe(Console.WriteLine);

Поэтому я обратился к документации MSDN, чтобы понять, что на самом деле делает Defer, и вот что там написано:

Returns an observable sequence that invokes the observable factory whenever a new observer subscribes.

Я предполагаю, что меня смущает это :в моем примере кода, я только когда-либо подписывался на Observable один раз, так почему же он, по-видимому, вызывает Observable.Start(...)снова и снова? Или я неправильно понимаю Repeat()? Любое разъяснение было бы здорово.

14
задан BFree 12 July 2012 в 18:38
поделиться