DEV Community

Cover image for Async/Await easy retry in c#
Ali Alp
Ali Alp

Posted on • Edited on

Async/Await easy retry in c#

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

Enter fullscreen mode Exit fullscreen mode

Usage

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");
}
Enter fullscreen mode Exit fullscreen mode

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());
Enter fullscreen mode Exit fullscreen mode

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>()
        {
            typeof(NullReferenceException)
        }
    });
Enter fullscreen mode Exit fullscreen mode

NuGet Installation

GitHub Source Code

Top comments (7)

Collapse
 
ilmtitan profile image
Jim Przybylinski

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:

        [Test]
        public async Task TestFailThenSucceed()
        {
            int iteration = 1;
            await Task.Run(() =>
            {
                if (iteration++ == 1)
                {
                    throw new Exception();
                }
            }).Retry();
        }

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

Collapse
 
alialp profile image
Ali Alp

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...

Collapse
 
thebuzzsaw profile image
Kelly Brown

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.

Collapse
 
alialp profile image
Ali Alp

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

Collapse
 
alialp profile image
Ali Alp

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

Collapse
 
katnel20 profile image
Katie Nelson

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?

Collapse
 
alialp profile image
Ali Alp

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.