RX Subscribe反复调用

时间:2015-01-15 04:18:57

标签: c# system.reactive

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

1 个答案:

答案 0 :(得分:1)

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

Observable.Throw来电OnError。您在调用OnError时未提供Subscribe处理程序,因此使用了默认的OnError处理程序。默认行为只会抛出错误并关闭进程。

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