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