为什么这些RX序列不顺序



假设我写

var gen = Observable.Range(1, 3)
  .SelectMany(x => Observable.Range(1, x));

所产生的序列如预期的。但是现在我写

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()本身将始终按顺序生成其事件。但是,SelectMany()在启动下一个之前,CC_6不会等待先前的可观察到完成。这意味着,随着序列的延长,将越来越多的重叠,因为下一个序列将在上一个序列完成之前开始。

如果您试图使输出保持顺序,那么您将需要使用不同的方式来扁平序列,例如Concat()

例如:

var gen = Observable.Range(1, 4)
  .Select(x => Observable.Range(1, x)).Concat();

输出:1,1,2,1,2,3,1,2,3,4

SelectMany()不同, Concat() dis 等待每个序列在启动下一个序列之前完成。

相关内容

  • 没有找到相关文章

最新更新