Skip to main content
The timeout strategy ensures that operations do not execute for longer than a configured duration.

TimeoutStrategyOptions

Configures the timeout resilience strategy.
public class TimeoutStrategyOptions : ResilienceStrategyOptions

Properties

Timeout
TimeSpan
default:"00:00:30"
The default timeout duration.
  • Must be greater than 10 milliseconds
  • Must be less than 24 hours
  • Default is 30 seconds
TimeoutGenerator
Func<TimeoutGeneratorArguments, ValueTask<TimeSpan>>?
default:"null"
A generator that produces the timeout for a given execution.When null, the Timeout property value is used instead.Special values:
  • Return TimeSpan.Zero or negative value: Strategy does nothing
  • Return Timeout.InfiniteTimeSpan: Disable timeout for the execution
OnTimeout
Func<OnTimeoutArguments, ValueTask>?
default:"null"
A delegate that is invoked when a timeout occurs.

Extension Methods

Add timeout strategies to a resilience pipeline:
public static ResiliencePipelineBuilder AddTimeout(
    this ResiliencePipelineBuilder builder,
    TimeoutStrategyOptions options)
public static ResiliencePipelineBuilder<TResult> AddTimeout<TResult>(
    this ResiliencePipelineBuilder<TResult> builder,
    TimeoutStrategyOptions options)

OnTimeoutArguments

Arguments passed to the OnTimeout callback.
public readonly struct OnTimeoutArguments
{
    public ResilienceContext Context { get; }
    public TimeSpan Timeout { get; }
}

Usage Example

var timeoutOptions = new TimeoutStrategyOptions
{
    Timeout = TimeSpan.FromSeconds(10),
    OnTimeout = args =>
    {
        Console.WriteLine($"Operation timed out after {args.Timeout}");
        return ValueTask.CompletedTask;
    }
};

var pipeline = new ResiliencePipelineBuilder()
    .AddTimeout(timeoutOptions)
    .Build();

await pipeline.ExecuteAsync(async ct =>
{
    await LongRunningOperationAsync(ct);
});

Dynamic Timeouts

Use TimeoutGenerator for per-execution timeout values:
var timeoutOptions = new TimeoutStrategyOptions
{
    TimeoutGenerator = args =>
    {
        // Use different timeouts based on operation type
        var operationType = args.Context.Properties.GetValue(
            new ResiliencePropertyKey<string>("OperationType"), 
            "default");
        
        return new ValueTask<TimeSpan>(operationType switch
        {
            "critical" => TimeSpan.FromSeconds(5),
            "normal" => TimeSpan.FromSeconds(10),
            _ => TimeSpan.FromSeconds(30)
        });
    }
};

Build docs developers (and LLMs) love