RX 订阅反复调用



我正在做一个广泛使用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"));
        }        
    }
}

它不是一遍又一遍地调用。您可能只是在 Visual Studio 中启用了"第一次机会时中断"异常,每次尝试继续时,它只是在相同的异常上中断。如果您实际继续该过程,应用程序将崩溃。

Observable.Throw打电话给OnError.您尚未在对 Subscribe 的调用中提供 OnError 处理程序,因此使用默认的OnError处理程序。默认行为只是抛出错误并关闭进程。

要重试,只需在调用 Subscribe 之前应用 Retry(3) 即可。要在第三次尝试后吞下错误,请提供一个OnError处理程序来Subscribe,尽管我不一定推荐后者。仔细考虑应用程序是否真的可以从这种情况中恢复。

相关内容

  • 没有找到相关文章

最新更新