Cover image for Async/Await easy retry in c#

Async/Await easy retry in c#

alialp profile image Ali Alp Updated on ・1 min read

In Asynchronous programming in some cases we need to retry a method if it fails. Easy-Retry can provide this functionality with ease :)

NuGet Installation

GitHub Source Code

.Net CLI
dotnet add package EasyRetry

Package Manager
Install-Package EasyRetry


Let's say there is a HTTP Task which you need to retry in case it fails

private async Task Task_NetworkBound()
    await new HttpClient().GetStringAsync("https://dotnetfoundation.org");

In order to retry it after 5 seconds you just need to do as follows

//With DI
await _easyRetry.Retry(async () => await Task_NetworkBound());

//Without DI
await new EasyRetry().Retry(async () => await Task_NetworkBound());

Or you can use the retry options to customize the behavior of the retry algorithm as follows

await _easyRetry.Retry(async () => await Task_NetworkBound()
    , new RetryOptions()
        Attempts = 3,
        DelayBetweenRetries = TimeSpan.FromSeconds(3),
        DelayBeforeFirstTry = TimeSpan.FromSeconds(2),
        EnableLogging = true,
        DoNotRetryOnTheseExceptionTypes = new List<Type>()

NuGet Installation

GitHub Source Code

Posted on by:

alialp profile

Ali Alp


“Take it easy” is nonsense , take it as hard as you can and don’t let it go :)


Editor guide

I don't think this library does what you think it does. Awaiting a task a second time does not restart the operation. For it to work, this test code will needs to pass:

        public async Task TestFailThenSucceed()
            int iteration = 1;
            await Task.Run(() =>
                if (iteration++ == 1)
                    throw new Exception();

It does not pass, and neither does the unit test you wrote.


You are right :) , I have fixed the code and released as version 2.0.0. your test has been included in the project as well :) github.com/alicommit-malp/Easy-Ret...


I feel like DoNotRetryOnTheseExceptions should either be a list of Type objects or a series of Predicate<Exception> filters. Holding instances seems odd... and wasteful.


You are right :) , Thanks for the tip, I have changed the code accordingly


I have changed the implementation and released the version 2.0.0. please check it out


How do you know that your awaited task failed? Mine either throw an exception or they time out.
How does this retry library handle both cases?


Why do you separate time out from exception? which case are you talking about? In my world time out is an exception as well and the Easy-Retry is running the awaited task in a try catch block Source Code.