コード例 #1
0
ファイル: RetryAsync.cs プロジェクト: replaysMike/AnyRetry
        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));
        }
コード例 #2
0
ファイル: RetryAsync.cs プロジェクト: replaysMike/AnyRetry
        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);
        }