调用"OnError"之后,似乎发生了死锁。即使我指定了Scheduler。默认情况下,结果更糟,导致线程旋转拉。
我在http://www.introtorx.com/content/v1.0.10621.0/11_AdvancedErrorHandling.html
中选择了这个例子var result = source
.Retry()
.Finally(() =>
Console.WriteLine("Finally")
);
result.Subscribe(
Console.WriteLine,
Console.WriteLine,
() => Console.WriteLine("Completed")
);
source.OnNext(1);
source.OnNext(2);
source.OnNext(3);
source.OnError(new Exception("Fail"));
source.OnNext(4);
Console.ReadKey();
我目前正在使用。. NET 4和响应扩展-主库2.2.4
Subject
记得收到的是OnError
还是OnCompleted
。如果是这样,任何新的订阅者在订阅后都会收到相同的OnError
或OnCompleted
事件。因为当Retry
知道底层的可观察对象有错误或完成时,它会无限地重新订阅,所以你将无限地重新订阅一个错误的源。
更具体地说,在示例中对主题进行OnError
之后,所有其他OnNext
和OnCompleted
事件(以及OnError)都会被忽略,并且主题只会将OnError
事件发送给所有现有的和任何新的订阅者。因此,Retry
只是错误事件的无限循环(Retry
不会向下游发送)。从本质上讲,Retry
正在做的正是它设计的目的。
值得注意的是,Retry
有一个接受一个数字的重载。此数字决定在放弃错误并转发错误之前需要重试的次数。
subject.Retry(10).Subscribe();