RetrySharp is a lightweight, high-performance retry utility for C# with zero external dependencies. Designed for systems where every microsecond and allocation matters.
- 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 = 1results in a direct call with negligible overhead (~1.0 us). - Sync & Async: Native, first-class support for both execution paths.
- Predictable: No hidden behavior or complex policy chaining.
- Minimalist: Tiny API surface (learnable in minutes).
dotnet add package RetrySharpUse 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());Retries up to 3 times (default) if any exception occurs.
Retry.Execute(() => DoWork());Supports CancellationToken and ConfigureAwait(false) internally.
await Retry.ExecuteAsync(async ct =>
{
await DoDownloadAsync(ct);
}, cancellationToken: cts.Token);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);Only retry for specific exception types.
var options = new RetryOptions
{
ExceptionFilter = ex => ex is HttpRequestException
};
Retry.Execute(() => SendRequest(), options);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);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.
- Simplicity: No complex inheritance or policy composition.
- Performance: Zero allocations in the hot path via state-based overloads.
- Safety: Do not swallow
OperationCanceledExceptionor system-critical errors.
Licensed under the MIT License.