Rxについての知識を広げようとしています。だから私はストリームで遊んでいて、彼らが私が期待するように行動させようとしています。Repeat()を使用して非決定論的な結果が得られる理由
OnCompletedと再購読の間の通知を緩める可能性があるため、Repeat()演算子が実際に問題を抱えていると読んだことがありますが、自分自身で次のようなことが起こる理由はわかりません。
結果1:
1 at 1006
3 at 3007
5 at 4995
それはそれはそこに2と4を残しそれでもこの結果内のことを良いことだ、私はこの例を実行すると、結果は完全に非決定的です
var subject = new Subject<string>();
var my = subject
.Take(1)
.Merge(Observable.Empty<string>().Delay(TimeSpan.FromMilliseconds(2000)))
.Repeat();
my.Subscribe(Console.WriteLine);
var stopwatch = new Stopwatch();
stopwatch.Start();
Scheduler.ThreadPool.Schedule(TimeSpan.FromSeconds(1),() => subject.OnNext("1 at " + stopwatch.ElapsedMilliseconds));
Scheduler.ThreadPool.Schedule(TimeSpan.FromSeconds(2),() => subject.OnNext("2 at " + stopwatch.ElapsedMilliseconds));
Scheduler.ThreadPool.Schedule(TimeSpan.FromSeconds(3),() => subject.OnNext("3 at " + stopwatch.ElapsedMilliseconds));
Scheduler.ThreadPool.Schedule(TimeSpan.FromSeconds(4),() => subject.OnNext("4 at " + stopwatch.ElapsedMilliseconds));
Scheduler.ThreadPool.Schedule(TimeSpan.FromSeconds(5),() => subject.OnNext("5 at " + stopwatch.ElapsedMilliseconds));
Scheduler.ThreadPool.Schedule(TimeSpan.FromSeconds(6),() => subject.OnNext("6 at " + stopwatch.ElapsedMilliseconds));
Console.ReadLine();
実際には3と5の間に実際の2秒のギャップがないので、いくらか違和感があります。
しかし、結果はさらに悪化する可能性があります。この1つを参照してください:
1 at 1003
2 at 2003
4 at 4005
6 at 6004
1から2の間に2秒のギャップはありません。ちょうど1秒です。なぜ彼はそれを放棄していないのですか?
誰かが私のことを明確にすることができたら、私はもっと幸せになるでしょう!
EDIT
は、私はちょうどそれがここで間違っているマージかもしれないことに気づきました。私は、連結方式に私のクエリをリファクタリングした場合、物事は、彼らが必要として起こるように見える:
var my = subject
.Take(1)
.Concat(Observable.Empty<string>().Delay(TimeSpan.FromMilliseconds(2000)))
.Repeat();