考虑这个例子:
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 - 正在完成工作以获取详细信息,但是:
从根本上说,您需要了解ObserveOn
和SubscribeOn
是装饰器,仅影响可观察对象的下游行为(Subscribe
的调用者和OnXXX
的接收者)-它们不会神奇地改变它们包装observable
的内部行为。
Where
执行的位置主要取决于observable
的实现,您不共享。当然,ObserveOn
没有影响,并且当且仅当observable
实现在订阅者的线程上产生事件时,SubscribeOn
可能会产生影响 - 但不要使用它来尝试和控制它,这不是它的用途。- 接下来,我想你在问订阅者是否
newObservable
有ObserveOn
和SubscribeOn
的行为?在这种情况下,是的。我再次怀疑花时间阅读上面的答案会使这一点变得非常明显。 - 当您在
newObserable
上添加Where
时,调用订阅者的线程不会受到影响 - 这纯粹是Where
的实现决定了这一点,与任何上游ObserveOn
或SubscribeOn
无关。
底线,我的答案顶部有一个摘要 - 这是最好的 TL;博士我有给你的。