/// <summary> /// Invoke logic with retry. /// </summary> /// <param name="input"></param> /// <returns></returns> protected async Task <TOutput> InvokeAsync(TInput input) { OperationId = Guid.NewGuid(); int attempt = 0; int delayMiliseconds = _delayMiliseconds; while (true) { attempt++; try { return(await ExecuteAsync(input).ConfigureAwait(false)); } catch (Exception e) { if (!_retryStrategy.Retry(OperationId, e, attempt, delayMiliseconds, x => { delayMiliseconds = x; })) { throw; } } await Task.Delay(delayMiliseconds).ConfigureAwait(false); } }
/// <summary> /// Invoke logic with retry. /// </summary> /// <param name="input"></param> /// <returns></returns> protected TOutput Invoke(TInput input) { OperationId = Guid.NewGuid(); int attempt = 0; int delayMiliseconds = _delayMiliseconds; while (true) { attempt++; try { return(Execute(input)); } catch (Exception e) { if (!_retryStrategy.Retry(OperationId, e, attempt, delayMiliseconds, x => { delayMiliseconds = x; })) { throw; } } SpinWait.SpinUntil(() => false, delayMiliseconds); } }
/// <summary> /// Invoke logic with retry. /// </summary> /// <param name="input"></param> /// <returns></returns> protected new TOutput Invoke(TInput input) { int attempt = 0; int delayMiliseconds = _delayMiliseconds; while (true) { attempt++; try { return(base.Invoke(input)); } catch (Exception e) { if (!_retryStrategy.Retry(CurrentOperationId, e, attempt, delayMiliseconds, x => { delayMiliseconds = x; })) { throw; } } SpinWait.SpinUntil(() => false, delayMiliseconds); } }