かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

インターバルと試行回数を指定できるRetryの作り方

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というメソッドが用意されてるので、お勧めしておきます。