private static async Task <T> InvokeAsync <T>(RetryActionWithParametersAndResultAsync <T> action, int retryIteration, int retryLimit, CancellationToken?cancellationToken) { if (cancellationToken.HasValue) { return(await Task.Run(() => action.Invoke(retryIteration, retryLimit), cancellationToken.Value)); } return(await action.Invoke(retryIteration, retryLimit)); }
private static async Task <T> PerformActionAsync <T>(RetryActionWithParametersAndResultAsync <T> action, TimeSpan retryInterval, int retryLimit, RetryPolicy retryPolicy, RetryPolicyOptions retryPolicyOptions, CancellationToken?cancellationToken, Action <Exception, int, int> onFailure, Func <bool> mustReturnTrueBeforeFail, params Type[] exceptionTypes) { var exceptions = new List <Exception>(); var startTime = DateTime.Now; var retryIteration = 0; do { try { // invoke the action return(await InvokeAsync(action, retryIteration, retryLimit, cancellationToken)); } catch (Exception ex) { exceptions.Add(ex); await HandleExceptionAsync(ex, startTime, retryInterval, retryIteration, retryLimit, retryPolicy, retryPolicyOptions, onFailure, exceptionTypes); } retryIteration++; } while (MustContinue(mustReturnTrueBeforeFail) || (retryIteration < retryLimit && (!cancellationToken.HasValue || !cancellationToken.Value.IsCancellationRequested))); throw new RetryTimeoutException(exceptions, retryLimit); }