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)
}
});
Top comments (7)
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:
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 ofType
objects or a series ofPredicate<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.