RetrySharp 1.2.0

dotnet add package RetrySharp --version 1.2.0
                    
NuGet\Install-Package RetrySharp -Version 1.2.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="RetrySharp" Version="1.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="RetrySharp" Version="1.2.0" />
                    
Directory.Packages.props
<PackageReference Include="RetrySharp" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add RetrySharp --version 1.2.0
                    
#r "nuget: RetrySharp, 1.2.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package RetrySharp@1.2.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=RetrySharp&version=1.2.0
                    
Install as a Cake Addin
#tool nuget:?package=RetrySharp&version=1.2.0
                    
Install as a Cake Tool

RetrySharp v1.2.0

RetrySharp is a lightweight, high-performance retry utility for C# with zero external dependencies. Designed for systems where every microsecond and allocation matters.

Key Features

  • Ultra-Low Latency: Optimized for high-throughput and low-latency environments.
  • Zero Allocations: Optimized state-based overloads to eliminate closure allocations on hot paths.
  • Fast-Path Optimization: Executing with MaxAttempts = 1 results in a direct call with negligible overhead (~1.0 us).
  • Sync & Async: Native, first-class support for both execution paths.
  • Input Validation: RetryOptions validates MaxAttempts and clamps delay values to prevent overflows.
  • Predictable: No hidden behavior or complex policy chaining.
  • Minimalist: Tiny API surface (learnable in minutes).

Installation

dotnet add package RetrySharp

Usage

1. High Performance (Zero Allocation)

Use the TState overloads to pass data into the action without creating a closure (eliminates heap allocations).

// Passes 'this' or any other state object directly to the static callback
Retry.Execute(state, static s => s.DoWork());

2. Basic Retry

Retries up to 3 times (default) if any exception occurs.

Retry.Execute(() => DoWork());

3. Async Retry with Cancellation

Supports CancellationToken and ConfigureAwait(false) internally.

await Retry.ExecuteAsync(async ct => 
{
    await DoDownloadAsync(ct);
}, cancellationToken: cts.Token);

4. Exponential Backoff

Includes built-in strategies for fixed, linear, and exponential delays.

var options = new RetryOptions
{
    MaxAttempts = 5,
    DelayStrategy = RetryDelays.Exponential(
        initialDelay: TimeSpan.FromMilliseconds(100),
        maxDelay: TimeSpan.FromSeconds(2)
    )
};

Retry.Execute(() => API.Call(), options);

5. Exception Filtering

Only retry for specific exception types.

var options = new RetryOptions
{
    ExceptionFilter = ex => ex is HttpRequestException
};

Retry.Execute(() => SendRequest(), options);

6. Jitter and Observability

Add jitter to prevent "thundering herd" and hook into retry events.

var options = new RetryOptions
{
    DelayStrategy = RetryDelays.WithJitter(RetryDelays.Fixed(TimeSpan.FromSeconds(1))),
    OnRetry = ctx => Console.WriteLine($"Retry {ctx.Attempt} due to {ctx.Exception.Message}")
};

Retry.Execute(() => CriticalTask(), options);

Performance Benchmarks

RetrySharp is significantly faster than general-purpose libraries like Polly, especially on the critical path.

Method Mean Allocated
RetrySharp_Sync_FastPath (State) 1.00 us 0 B
RetrySharp_Async_FastPath (State) 2.09 us 0 B
Polly_Sync_FastPath 11.43 us 64 B
Polly_Async_FastPath 10.95 us 64 B
RetrySharp_Sync_OneRetry 18.28 us 320 B
Polly_Sync_OneRetry 31.90 us 608 B

Benchmarks run on .NET 10.0.5, Intel Xeon CPU E31225 3.10GHz.

Core Principles

  1. Simplicity: No complex inheritance or policy composition.
  2. Performance: Zero allocations in the hot path via state-based overloads.
  3. Safety: Do not swallow OperationCanceledException or system-critical errors.

License

Licensed under the MIT License.

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.2.0 88 5/5/2026
1.1.0 102 4/10/2026
1.0.0 111 3/28/2026

- Implemented RetryOptions validation: MaxAttempts now throws ArgumentOutOfRangeException if set to 0 or less.
     - Added TimeSpan clamping to prevent overflows and negative delays in delay strategies.
     - Custom DelayStrategy delegates now have their return values automatically clamped.