主题& OnError后重试操作无法正常工作

时间:2014-05-23 14:37:14

标签: c# .net .net-4.0 system.reactive

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

1 个答案:

答案 0 :(得分:2)

Subject会记住是否收到了OnErrorOnCompleted。如果是这样,任何新订阅者在订阅后都会立即收到相同的OnErrorOnCompleted事件。由于Retry在知道基础observable已经错误或已完成时将无限期重新订阅,因此您将无限重新订阅错误的源。

更具体地说,在您的示例中OnError'主题后,所有其他OnNextOnCompleted事件(以及OnError,就此而言)都会被忽略,并且主题只会向所有现有订户和任何新订阅者发送OnError事件。因此,Retry只是一个无限循环的错误事件(Retry不向下游发送)。从本质上讲,Retry完全按照设计目的进行。

值得注意的是Retry有一个带有数字的重载。此数字确定在放弃和转发错误之前重试的次数。

subject.Retry(10).Subscribe();