Я работал над большим проектом, который широко использует 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"));
}
}
}
Это не называется снова и снова. Вероятно, вы просто имеете Break on first chance exceptions, включенные в Visual Studio, и каждый раз, когда вы пытаетесь продолжить его, он просто разбивается на одно и то же исключение. Если бы вы действительно продолжали процесс, приложение просто потерпело крах.
Observable.Throw
вызывает OnError
. Вы не предоставили обработчик OnError
в своем вызове Subscribe
, поэтому используется обработчик OnError
по умолчанию. Поведение по умолчанию просто вызывает ошибку и сбрасывает процесс.
Чтобы повторить попытку, попробуйте применить Retry(3)
перед вызовом Subscribe
. Для того, чтобы усвоить ошибку после 3 - й попытки, дает OnError
обработчика Subscribe
, хотя я не обязательно рекомендую последний. Подумайте, действительно ли приложение действительно может восстановиться после такого сценария.