Пример #1
0
        /// <summary>
        /// Retry a function n times or until successful.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="function"></param>
        /// <param name="config"></param>
        /// <returns></returns>
        static RetryResult <T> RetryFunc <T>(Func <T> function, RetryConfig config)
        {
            var retryInfo = new RetryInfo();
            var result    = new RetryResult <T>(default(T), retryInfo);

            var  isOk             = false;
            var  retriesRemaining = config.MaxRetries;
            var  timeoutAt        = DateTime.Now.Add(config.TotalTimeout);
            bool hasTimeout       = config.HasTimeout;

            while (!isOk && (retriesRemaining >= 0 || config.RetryForever) &&
                   (!hasTimeout || (config.HasTimeout && DateTime.Now < timeoutAt)))
            {
                result.RetryInfo.Executions++;

                try
                {
                    result.Result = function();
                    isOk          = true;
                }
                catch (Exception ex)
                {
                    result.RetryInfo.Exceptions.Add(ex);

                    // Wait before retrying.
                    if (config.WaitBetweenRetries > TimeSpan.Zero)
                    {
                        Thread.Sleep(config.WaitBetweenRetries);
                    }
                }

                retriesRemaining--;
            }

            return(result);
        }
 /// <summary>
 /// Configure a maximum retry time.
 /// </summary>
 /// <returns>The after.</returns>
 /// <param name="retryConfig">Retry config.</param>
 /// <param name="timeout">Timeout.</param>
 public static RetryConfig TimeoutAfter(this RetryConfig retryConfig, TimeSpan timeout)
 {
     retryConfig.TotalTimeout = timeout;
     return(retryConfig);
 }
 /// <summary>
 /// Retry until it's succesful.
 /// </summary>
 /// <param name="retryConfig"></param>
 /// <returns></returns>
 public static RetryConfig RetryUntilSuccessful(this RetryConfig retryConfig)
 {
     retryConfig.RetryForever = true;
     return(retryConfig);
 }
 /// <summary>
 /// Specify the number of retries.
 /// </summary>
 /// <param name="retryConfig"></param>
 /// <param name="retries"></param>
 /// <returns></returns>
 public static RetryConfig WithNumberOfRetries(this RetryConfig retryConfig, int retries)
 {
     retryConfig.MaxRetries = retries;
     return(retryConfig);
 }
 /// <summary>
 /// Wait command for an specified timespan duration between retries.
 /// </summary>
 /// <param name="retryConfig"></param>
 /// <param name="wait"></param>
 /// <returns></returns>
 public static RetryConfig WithWaitOf(this RetryConfig retryConfig, TimeSpan wait)
 {
     retryConfig.WaitBetweenRetries = wait;
     return(retryConfig);
 }
 /// <summary>
 /// Wait command n milliseconds between retries.
 /// </summary>
 /// <param name="retryConfig"></param>
 /// <param name="msWait"></param>
 /// <returns></returns>
 public static RetryConfig WithMsWaitOf(this RetryConfig retryConfig, int msWait)
 {
     retryConfig.WaitBetweenRetries = TimeSpan.FromMilliseconds(msWait);
     return(retryConfig);
 }
Пример #7
0
 /// <summary>
 /// Initialize the retrier.
 /// </summary>
 /// <param name="retryConfig"></param>
 public static RetryConfig Init(RetryConfig retryConfig)
 {
     return(retryConfig);
 }