Exemple #1
0
        public static Task RetryOnThrottle(this IMessageSender sender, Func <IMessageSender, Task> action, TimeSpan delay, int maxRetryAttempts, int retryAttempts = 0)
        {
            var task = action(sender);

            return(task.ContinueWith(async t =>
            {
                var exception = ExceptionDispatchInfo.Capture(t.Exception?.InnerException);
                var serverBusy = exception.SourceException is InvalidOperationException;

                if (serverBusy && retryAttempts < maxRetryAttempts)
                {
                    await Task.Delay(delay);
                    await sender.RetryOnThrottle(action, delay, maxRetryAttempts, ++retryAttempts);
                }
                else if (t.IsFaulted)
                {
                    exception.Throw();
                }
            })
                   .Unwrap());
        }