假设我写下以下内容:
生成的序列是
现在生成的序列是
var gen = Observable.Range(1, 3)
.SelectMany(x => Observable.Range(1, x));
生成的序列是
1 1 2 1 2 3
,与预期相符。但现在如果我写下以下代码:var gen = Observable.Range(1, 4)
.SelectMany(x => Observable.Range(1, x));
现在生成的序列是
1 1 2 1 2 1 3 2 3 4
,而不是我们期望的1 1 2 1 2 3 1 2 3 4
。这是为什么?SelectMany()
是否进行了某种多线程合并?
Observable.Range(1, 4, ImmediateScheduler.Instance).SelectMany(x => Observable.Range(1, x, ImmediateScheduler.Instance))
按顺序创建序列。 - NicoSelectMany
本身不涉及调度。默认情况下,.Range
使用CurrentThreadScheduler
,该调度程序会排队操作,但不是多线程的。通常,在序列中,Rx不会按顺序进行,除非您通过操作使它们按顺序进行 - 这正是它们可观察而不是可枚举的原因。 - Jeroen MostertObservable.Range()
不能保证按顺序生成事件吗? - Dmitri Nesteruk