调用“OnError”后,看起来像是发生了死锁。 即使我指定了Scheduler.Default,结果也会更糟,导致线程旋转。
我在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 和 Reactive Extensions - 主库2.2.4
答案 0 :(得分:2)
Subject
会记住是否收到了OnError
或OnCompleted
。如果是这样,任何新订阅者在订阅后都会立即收到相同的OnError
或OnCompleted
事件。由于Retry
在知道基础observable已经错误或已完成时将无限期重新订阅,因此您将无限重新订阅错误的源。
更具体地说,在您的示例中OnError
'主题后,所有其他OnNext
和OnCompleted
事件(以及OnError,就此而言)都会被忽略,并且主题只会向所有现有订户和任何新订阅者发送OnError
事件。因此,Retry
只是一个无限循环的错误事件(Retry
不向下游发送)。从本质上讲,Retry
完全按照设计目的进行。
值得注意的是Retry
有一个带有数字的重载。此数字确定在放弃和转发错误之前重试的次数。
subject.Retry(10).Subscribe();