我正在开发一个广泛使用Rx的大型项目。在一个特定的实例中,我注意到其中一个订阅引发了异常。那时我假设订阅只会完成(有错误),因为我没有任何Retry()调用。但是,我看到的是订阅反复重试。
我试图在一个小例子中重复类似的案例,如下所示。我提出了一个断点
Console.WriteLine("!");
预计在订阅失败后会被点击。但它永远不会到达。 GetImportantValues()。只是一遍又一遍地调用订阅。
我不明白为什么。我本来期望抛出的异常会终止订阅尝试。
如果抛出异常,我想修改下面的示例重试3次,之后再完全停止。
using System;
using System.Reactive.Linq;
namespace RxTest
{
class Program
{
static void Main(string[] args)
{
var ob1 = GetImportantValues().Subscribe(Console.WriteLine);
Console.WriteLine("!");
Console.ReadLine();
}
private static IObservable<int> GetImportantValues()
{
var obs = GetThem();
return obs;
}
private static IObservable<int> GetThem()
{
//Do some work. Would return a valid observable if everything is ok
return Observable.Throw<int>(new Exception("test"));
}
}
}
答案 0 :(得分:1)
没有被一遍又一遍地打电话。您可能只是在Visual Studio中启用了Break on first chance exceptions,并且每次尝试继续它时都会打破同一个异常。如果你真的继续这个过程,应用程序就会崩溃。
Observable.Throw
来电OnError
。您在调用OnError
时未提供Subscribe
处理程序,因此使用了默认的OnError
处理程序。默认行为只会抛出错误并关闭进程。
要重试,只需在调用Retry(3)
之前应用Subscribe
即可。要在第3次尝试后吞下错误,请向OnError
提供Subscribe
处理程序,但我不一定会推荐后者。仔细考虑应用程序是否可以从这种情况中恢复。