File: ExponentialRetry.cs
Web Access
Project: src\src\Microsoft.DotNet.XliffTasks\Microsoft.DotNet.XliffTasks.csproj (Microsoft.DotNet.XliffTasks)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
 
namespace XliffTasks
{
    public class ExponentialRetry
    {
        public static void ExecuteWithRetryOnIOException(
           Action action,
           int maxRetryCount)
        {
            int count = 1;
            foreach (TimeSpan t in Intervals)
            {
                try
                {
                    action();
                    return;
                }
                catch (IOException e)
                {
                    if (count == maxRetryCount)
                        throw new IOException($"Retry failed after {count} times", e);
                    count++;
                }
                Thread.Sleep(t);
            }
            throw new Exception("Timer should not be exhausted");
        }
 
        private static IEnumerable<TimeSpan> Intervals
        {
            get
            {
                int milliseconds = 5;
                while (true)
                {
                    yield return TimeSpan.FromMilliseconds(milliseconds);
                    milliseconds *= 2;
                }
            }
        }
    }
}