Rx 中的分支可观察量和并发配置



考虑这个例子:

observable
.Where(somePredicate)
.ObserveOn(TaskPoolScheduler.Default)
.SubscribeOn(TaskPoolScheduler.Default)
.Subscribe(x => { });

Where()是在任务池中执行的,还是仅在订阅函数中执行?

接下来:

var newObservable = observable.
.Where(somePredicate)
.ObserveOn(TaskPoolScheduler.Default)
.SubscribeOn(TaskPoolScheduler.Default);
newObservable.Subscribe(x => { });
newObservable.Subscribe(x => { });

在此示例中,两个订阅是否都保留newObservable的并发设置?从这个意义上说,可观察量的创建者是否可以定义不同的并发默认值(相对于 Rx 默认值)并将其传递给可观察量的用户,除非被覆盖?

编辑:

现在,如果:

newObservable
.Where(somePredicate2)
.Subscribe(x => { })

现在是否也在任务池上执行?

根据评论,请参阅我更完整的答案 ObserveOn 和 SubscribeOn - 正在完成工作以获取详细信息,但是:

从根本上说,您需要了解ObserveOnSubscribeOn是装饰器,仅影响可观察对象的下游行为(Subscribe的调用者和OnXXX的接收者)-它们不会神奇地改变它们包装observable的内部行为。

  • Where执行的位置主要取决于observable的实现,您不共享。当然,ObserveOn没有影响,并且当且仅observable实现在订阅者的线程上产生事件时,SubscribeOn可能会产生影响 - 但不要使用它来尝试和控制它,这不是它的用途。
  • 接下来,我想你在问订阅者是否newObservableObserveOnSubscribeOn的行为?在这种情况下,是的。我再次怀疑花时间阅读上面的答案会使这一点变得非常明显。
  • 当您在newObserable上添加Where时,调用订阅者的线程不会受到影响 - 这纯粹是Where的实现决定了这一点,与任何上游ObserveOnSubscribeOn无关。

底线,我的答案顶部有一个摘要 - 这是最好的 TL;博士我有给你的。

最新更新