RX Подписаться звонил повторно

1

Я работал над большим проектом, который широко использует 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"));
        }        
    }
}
Теги:
system.reactive

1 ответ

1
Лучший ответ

Это не называется снова и снова. Вероятно, вы просто имеете Break on first chance exceptions, включенные в Visual Studio, и каждый раз, когда вы пытаетесь продолжить его, он просто разбивается на одно и то же исключение. Если бы вы действительно продолжали процесс, приложение просто потерпело крах.

Observable.Throw вызывает OnError. Вы не предоставили обработчик OnError в своем вызове Subscribe, поэтому используется обработчик OnError по умолчанию. Поведение по умолчанию просто вызывает ошибку и сбрасывает процесс.

Чтобы повторить попытку, попробуйте применить Retry(3) перед вызовом Subscribe. Для того, чтобы усвоить ошибку после 3 - й попытки, дает OnError обработчика Subscribe, хотя я не обязательно рекомендую последний. Подумайте, действительно ли приложение действительно может восстановиться после такого сценария.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню