protected override bool ShouldRetryImpl(RetryState retryStateObj) { Contract.Assert(retryStateObj is RetryStateEx); RetryStateEx retryState = (RetryStateEx)retryStateObj; // Calculate the delay as exponential value based on the number of retries. retryState.Delay = RetryPolicyUtils.CalcExponentialRetryDelay( retryState.RetryCount, _intervalFactor, _minInterval, _maxInterval); // Add the delay to the total retry time retryState.TotalRetryTime = retryState.TotalRetryTime + retryState.Delay; // Calculate the maximum total retry time depending on how long ago was the task (this retry policy) started. // Longer running tasks are less eager to abort since, more work is has been done. TimeSpan totalRetryTimeLimit = checked(TimeSpan.FromMilliseconds( Math.Max( Math.Min( _stopwatch.ElapsedMilliseconds * _totalRetryTimeLimitRate, _maxTotalRetryTimeLimit.TotalMilliseconds), _minTotalRetryTimeLimit.TotalMilliseconds))); if (retryState.TotalRetryTime <= totalRetryTimeLimit) { return true; } retryState.Delay = TimeSpan.Zero; return false; }
protected override bool ShouldRetryImpl(RetryState retryState) { Contract.Assert(retryState != null); if (IsLessThanMaxRetryCount(retryState.RetryCount, _maxRetryCount)) { retryState.Delay = RetryPolicyUtils.CalcExponentialRetryDelay(retryState.RetryCount, _intervalFactor, _minInterval, _maxInterval); return true; } retryState.Delay = TimeSpan.Zero; return false; }