我当时正在做一个更大的项目,它广泛地使用了Rx。在一个特定的例子中,我注意到其中一个订阅抛出了一个异常。此时,我假设订阅将刚刚完成(有错误),因为我没有任何Retry()调用。然而,我看到的是订阅一再重试。
我试图在一个小例子中复制一个类似的案例,如下所示。我开了个断点
Console.WriteLine("!");并预计在订阅失败后就会受到影响。但它从来没有达到。GetImportantValues().Subscribe只是一次又一次地被调用。
但我不明白为什么。我本以为抛出的异常会阻止订阅尝试。
如果抛出异常,我想修改下面的示例重试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"));
}
}
}发布于 2015-01-15 04:31:58
不会被一次又一次的召唤。您可能只是在Visual中启用了破除第一次机会例外,每次尝试继续,它都会破坏相同的异常。如果您真的要继续这个过程,应用程序就会崩溃。
Observable.Throw打电话给OnError。您还没有在调用OnError时提供Subscribe处理程序,因此使用了默认的OnError处理程序。默认行为只是抛出错误并降低进程。
要重试,只需在调用Retry(3)之前应用Subscribe。要在第三次尝试之后吞下错误,请向OnError提供一个Subscribe处理程序,尽管我不一定推荐后者。仔细考虑应用程序是否真的能从这种场景中恢复过来。
https://stackoverflow.com/questions/27956755
复制相似问题