/// <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); }
/// <summary> /// Initialize the retrier. /// </summary> /// <param name="retryConfig"></param> public static RetryConfig Init(RetryConfig retryConfig) { return(retryConfig); }