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
将应用于调用后的流部分。对的如果你能写一个简短的总结(另一条线索对深入理解很有帮助)作为答案,我可以接受。我仍然很困惑。当我的脑袋不转的时候,我会再读一次较长的答案,然后反驳:)