読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

インターバルと試行回数を指定できる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というメソッドが用意されてるので、お勧めしておきます。