private static async Task <T> Retry <TException, T>(this Task <T> self, RetryPolicy retryPolicy, Func <Task <T> > retryProc, bool continueOnCapturedContext) where TException : Exception { TException ex; do { try { return(await self.ConfigureAwait(continueOnCapturedContext)); } catch (TException e) { ex = e; await retryPolicy.Delay.ConfigureAwait(continueOnCapturedContext); self = retryProc(); retryPolicy.IncrementRetryCount(); } }while (retryPolicy.ShouldRetry); throw ex; }
void ValidateRetryPolicyBuiltIn() { String clientId = "someClientEntity"; RetryPolicy retry = RetryPolicy.Default; retry.IncrementRetryCount(clientId); TimeSpan?firstRetryInterval = retry.GetNextRetryInterval(clientId, new ServerBusyException(string.Empty), TimeSpan.FromSeconds(60)); Log("firstRetryInterval: " + firstRetryInterval); Assert.True(firstRetryInterval != null); retry.IncrementRetryCount(clientId); TimeSpan?secondRetryInterval = retry.GetNextRetryInterval(clientId, new ServerBusyException(string.Empty), TimeSpan.FromSeconds(60)); Log("secondRetryInterval: " + secondRetryInterval); Assert.True(secondRetryInterval != null); Assert.True(secondRetryInterval?.TotalMilliseconds > firstRetryInterval?.TotalMilliseconds); retry.IncrementRetryCount(clientId); TimeSpan?thirdRetryInterval = retry.GetNextRetryInterval(clientId, new ServerBusyException(string.Empty), TimeSpan.FromSeconds(60)); Log("thirdRetryInterval: " + thirdRetryInterval); Assert.True(thirdRetryInterval != null); Assert.True(thirdRetryInterval?.TotalMilliseconds > secondRetryInterval?.TotalMilliseconds); retry.IncrementRetryCount(clientId); TimeSpan?fourthRetryInterval = retry.GetNextRetryInterval(clientId, new ServerBusyException(string.Empty), TimeSpan.FromSeconds(60)); Log("fourthRetryInterval: " + fourthRetryInterval); Assert.True(fourthRetryInterval != null); Assert.True(fourthRetryInterval?.TotalMilliseconds > thirdRetryInterval?.TotalMilliseconds); retry.IncrementRetryCount(clientId); TimeSpan?fifthRetryInterval = retry.GetNextRetryInterval(clientId, new ServerBusyException(string.Empty), TimeSpan.FromSeconds(60)); Log("fifthRetryInterval: " + fifthRetryInterval); Assert.True(fifthRetryInterval != null); Assert.True(fifthRetryInterval?.TotalMilliseconds > fourthRetryInterval?.TotalMilliseconds); retry.IncrementRetryCount(clientId); TimeSpan?sixthRetryInterval = retry.GetNextRetryInterval(clientId, new ServerBusyException(string.Empty), TimeSpan.FromSeconds(60)); Log("sixthRetryInterval: " + sixthRetryInterval); Assert.True(sixthRetryInterval != null); Assert.True(sixthRetryInterval?.TotalMilliseconds > fifthRetryInterval?.TotalMilliseconds); retry.IncrementRetryCount(clientId); TimeSpan?seventhRetryInterval = retry.GetNextRetryInterval(clientId, new ServerBusyException(string.Empty), TimeSpan.FromSeconds(60)); Log("seventhRetryInterval: " + seventhRetryInterval); Assert.True(seventhRetryInterval != null); Assert.True(seventhRetryInterval?.TotalMilliseconds > sixthRetryInterval?.TotalMilliseconds); retry.IncrementRetryCount(clientId); TimeSpan?nextRetryInterval = retry.GetNextRetryInterval(clientId, new EventHubsException(false), TimeSpan.FromSeconds(60)); Assert.True(nextRetryInterval == null); retry.ResetRetryCount(clientId); retry.IncrementRetryCount(clientId); TimeSpan?firstRetryIntervalAfterReset = retry.GetNextRetryInterval(clientId, new ServerBusyException(string.Empty), TimeSpan.FromSeconds(60)); Assert.True(firstRetryInterval.Equals(firstRetryIntervalAfterReset)); retry = RetryPolicy.NoRetry; retry.IncrementRetryCount(clientId); TimeSpan?noRetryInterval = retry.GetNextRetryInterval(clientId, new ServerBusyException(string.Empty), TimeSpan.FromSeconds(60)); Assert.True(noRetryInterval == null); }