100ミリ秒ごとに新しい値を送り出す乱数の非同期ストリームを生成したいとします。解決策を考え出そうとしたとき、私の最初の試みは次のようになりました。
var random = new Random();
Observable.Start(() => random.Next())
.Delay(TimeSpan.FromMilliseconds(100))
.Repeat()
.Subscribe(Console.WriteLine);
これを実行しようとすると、同じ値を何度も繰り返し続けることに気付くでしょう。OK、私はリピートがどのように機能するかを誤解したと思います。少し遊んだ後、私はこれを思いつきました、そしてそれはうまくいきました:
var random = new Random();
Observable.Defer(()=> Observable.Start(() => random.Next()))
.Delay(TimeSpan.FromMilliseconds(100))
.Repeat()
.Subscribe(Console.WriteLine);
そこで、MSDNのドキュメントにアクセスして、Deferが実際に何をしているのかを理解しました。これは、次のように述べています。
新しいオブザーバーがサブスクライブするたびにオブザーバブルファクトリを呼び出すオブザーバブルシーケンスを返します。
私の混乱はこれだと思います。私のコードサンプルでは、Observableを一度しかサブスクライブしていないのに、なぜそれが何度も何度も呼び出されているように見えるのObservable.Start(...)
ですか?それとも私は誤解していRepeat()
ますか?どんな説明でも素晴らしいでしょう。