RX Subscribe 重复调用

RX Subscribe called repeatedly

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

它不会被一遍又一遍地调用。您可能只是在 Visual Studio 中启用了 Break on first chance exceptions 并且每次您尝试继续时它都只是在同一个异常上中断。如果您真的要继续这个过程,应用程序就会崩溃。

Observable.Throw 呼叫 OnError。您没有在调用 Subscribe 时提供 OnError 处理程序,因此使用默认的 OnError 处理程序。默认行为只是抛出错误并关闭进程。

要重试,只需在调用 Subscribe 之前应用 Retry(3)。要在第 3 次尝试后吞下错误,请为 Subscribe 提供一个 OnError 处理程序,但我不一定推荐后者。仔细想想应用程序是否真的可以从这样的场景中恢复。