C# (编辑)关于处理观察员例外情况的说明

C# (编辑)关于处理观察员例外情况的说明,c#,system.reactive,reactive-programming,C#,System.reactive,Reactive Programming,在这些评论的提示下,下面是一些关于处理观察者抛出的异常的附加说明 当异常源于OnNext处理程序时,它位于堆栈中的Rx代码之下,因此不可能负责任地将其“返回”给用户。此时,用户必须被视为已死亡。我们所能合理地做的就是处置订阅并清理由此产生的资源。这是基于推送的代码的结果。与IEnumerable不同,IEnumerable可以将异常抛出到客户机代码中,因为是客户机执行拉取操作 请注意,某些运算符包含用户提供的逻辑(如Where运算符中的谓词表达式),这些逻辑将通过OnError通道将错误传播给观

在这些评论的提示下,下面是一些关于处理观察者抛出的异常的附加说明

当异常源于OnNext处理程序时,它位于堆栈中的Rx代码之下,因此不可能负责任地将其“返回”给用户。此时,用户必须被视为已死亡。我们所能合理地做的就是处置订阅并清理由此产生的资源。这是基于推送的代码的结果。与IEnumerable不同,IEnumerable可以将异常抛出到客户机代码中,因为是客户机执行拉取操作

请注意,某些运算符包含用户提供的逻辑(如
Where
运算符中的谓词表达式),这些逻辑将通过
OnError
通道将错误传播给观察者,但一旦观察者因在自己的代码中抛出异常而死亡,就是这样。不会再通过任何
OnXXX
方法调用它


还有很多关于这方面的内容,大约从一半开始。

谢谢你的回答。结果确实相反,我的错误(修正了问题)修正了我的答案,以反映你修正了问题的事实再次感谢您的详细回答。我有一些关于它的问题:1。你为什么要写上下文是ys?事件(编号4)在xs流中引发。2.为什么异常会删除线程,直到用户的onNext才抛出堆栈?嗨,ie1-DOH!我在复制/粘贴图表时犯了一个错误,发现得很好!:)现在应该更有意义了!让我知道这是否解决了你悬而未决的问题。很抱歉给您带来困惑。您好,如果您也能参考第二个问题,我将非常高兴。谢谢您的回答。结果确实相反,我的错误(修正了问题)修正了我的答案,以反映你修正了问题的事实再次感谢您的详细回答。我有一些关于它的问题:1。你为什么要写上下文是ys?事件(编号4)在xs流中引发。2.为什么异常会删除线程,直到用户的onNext才抛出堆栈?嗨,ie1-DOH!我在复制/粘贴图表时犯了一个错误,发现得很好!:)现在应该更有意义了!让我知道这是否解决了你悬而未决的问题。对不起,我有点困惑。嗨,如果你也能提到第二个问题,我会很高兴的
void main(){
  var numbersSubject=new Subject<int>();

  numbersSubject.subscribe(throwMethod);   // 1,2,3,4,6,7,8,9,10
  // numbersSubject.select(num=>num).subscribe(throwMethod);   // 1,2,3,4

  for(int i=0;i<10;i++)
  {
    try{
      numbersSubject.OnNext(i);
    }catch{}
  }
}

void throwMethod(int num)
{
   if(num==5)
       throw new Exception();
   Console.writeLine(i);
}
0,1,2,3,4,6,7,8,9
0,1,2,3,4
numbersSubject.Subscribe(throwMethod);   
var source = numbersSubject.Select(num=>num);
source.Subscribe(Console.WriteLine); // 0,1,2,3,4,5,6,7,8,9
source.Subscribe(throwMethod);   // 0,1,2,3,4
var xs  = Observable.Interval(TimeSpan.FromSeconds(1));
var ys  = <some random sequence>;
var res = xs.CombineLatest(ys, (x, y) => x + y);
xs  -----0-----1-----2-----3-----4-----5-----6-----7-----8-----9---...
               |     |     |     |     |     |     |     |     |
ys  --------4--+--5--+-----+--2--+--1--+-----+-----+--0--+-----+---...
            |  |  |  |     |  |  |  |  |     |     |  |  |     |
            v  v  v  v     v  v  v  v  v     v     v  v  v     v
res --------4--5--6--7-----8--5--6--5--6-----7-----8--7--8-----9---...
                              |
                             @#&
        var __noError = false;
        try
        {
            observer.OnNext(value);
            __noError = true;
        }
        finally
        {
            if (!__noError)
                Dispose();
        }
var numbersSubject = new Subject<int>();
var source = numbersSubject.Synchronize();
source.Subscribe(throwMethod);
0,1,2,3,4,6,7,8,9
var numbersSubject = new Subject<int>();
var source = numbersSubject.Synchronize();
source.Synchronize().Subscribe(throwMethod);
0,1,2,3,4