Reactive Extensionsには回数指定のリトライか、無限リトライしか用意されてません。世の中には、一定間隔をあけてリトライ処理をしたいという需要もあります。ということで、さくっと試してみました・
static class Ex { public static IObservable<T> RetryEx<T>(this IObservable<T> self, int retryCount, TimeSpan retrySpan) { int count = 0; IObservable<T> retry = null; retry = self.Catch((Exception ex) => { if (count++ < retryCount) { // retry return retry.DelaySubscription(retrySpan); } return Observable.Throw<T>(ex); }); return retry; } }
リトライ回数の以下ならDelaySubscriptionで、Subscribeを遅延させて、リトライの回数を超えていたら例外を投げています。
因みに、ReactivePropertyには、これをもっとしっかり作ったOnErrorRetryというメソッドが用意されてるので、お勧めしておきます。