C# Rx中的分支观测值和并发配置
考虑这个例子:C# Rx中的分支观测值和并发配置,c#,system.reactive,C#,System.reactive,考虑这个例子: observable .Where(somePredicate) .ObserveOn(TaskPoolScheduler.Default) .SubscribeOn(TaskPoolScheduler.Default) .Subscribe(x => { }); 是在任务池中执行Where(),还是只执行subscribe函数 以下为: var newObservable = observable. .Where(somePredicate) .
observable
.Where(somePredicate)
.ObserveOn(TaskPoolScheduler.Default)
.SubscribeOn(TaskPoolScheduler.Default)
.Subscribe(x => { });
是在任务池中执行Where()
,还是只执行subscribe函数
以下为:
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
和subscribebeon
是只影响可观察对象的下游行为的装饰器(调用Subscribe
和接收OnXXX
),它们不会神奇地改变所包装的可观察对象的内部行为
- 其中执行的
,
主要取决于可观察的的实现,您不共享。当然,ObserveOn
没有影响,SubscribeOn
可能有影响,如果且仅当observeable
实现在订阅者的线程上产生事件-但不要使用它来尝试和控制它,这不是它的目的
- 在接下来的部分中,我想您会问
newobserveable
的订户是否具有ObserveOn
和subscribeeOn
的行为?在这种情况下,是的。我再次怀疑花时间阅读上述答案会使这一点变得非常明显
- 当您在
newObserable
上添加Where
时,调用订阅者的线程不会受到影响-这完全是Where
的实现决定的,与任何上游ObserveOn
或SubscribeOn
无关
总之,在我的答案的顶部有一个总结——这是最好的TL;DR I为您准备了。至于#1,所有操作都在线程池中执行。如果在主线程上执行Where
,则您的应用程序在等待事件时将被阻塞。Rx中关于#2检查的并发性有一个很好的介绍。@PanagiotisKanavos因此,如果我理解正确的话,ObserveOn
和SubscribeOn
将应用于调用后的流部分。对的如果你能写一个简短的总结(另一条线索对深入理解很有帮助)作为答案,我可以接受。我仍然很困惑。当我的脑袋不转的时候,我会再读一次较长的答案,然后反驳:)