主题,OnError后重试操作未按预期工作

本文关键字:工作 操作 OnError 重试 主题 | 更新日期: 2023-09-27 18:05:03

调用"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

主题,OnError后重试操作未按预期工作

Subject记得收到的是OnError还是OnCompleted。如果是这样,任何新的订阅者在订阅后都会收到相同的OnErrorOnCompleted事件。因为当Retry知道底层的可观察对象有错误或完成时,它会无限地重新订阅,所以你将无限地重新订阅一个错误的源。

更具体地说,在示例中对主题进行OnError之后,所有其他OnNextOnCompleted事件(以及OnError)都会被忽略,并且主题只会将OnError事件发送给所有现有的和任何新的订阅者。因此,Retry只是错误事件的无限循环(Retry不会向下游发送)。从本质上讲,Retry正在做的正是它设计的目的。

值得注意的是,Retry有一个接受一个数字的重载。此数字决定在放弃错误并转发错误之前需要重试的次数。

subject.Retry(10).Subscribe();