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

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");
}

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>()
        {
            typeof(NullReferenceException)
        }
    });

NuGet Installation

GitHub Source Code

Discussion

pic
Editor guide
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 Author

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 Author

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

Collapse
alialp profile image
Ali Alp Author

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 Author

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.