Skip to content

Add a sample showing how to implement a suspendable execution strategy #3667

Open
@AndriySvyryd

Description

@AndriySvyryd
public abstract class MyExecutionStrategy : SqlServerRetryingExecutionStrategy
{
    public MyExecutionStrategy(
        ExecutionStrategyDependencies dependencies)
        : base(dependencies)
    {
    }

    private static readonly AsyncLocal<bool?> _suspend = new();

    public static bool Suspend
    {
        get => _suspend.Value ?? false;
        set => _suspend.Value = value;
    }

    public override bool RetriesOnFailure
        => !Suspend && base.RetriesOnFailure;

    public override TResult Execute<TState, TResult>(
        TState state,
        Func<DbContext, TState, TResult> operation,
        Func<DbContext, TState, ExecutionResult<TResult>>? verifySucceeded)
        => Suspend
            ? operation(Dependencies.CurrentContext.Context, state)
            : base.Execute(state, operation, verifySucceeded);

    public override Task<TResult> ExecuteAsync<TState, TResult>(
        TState state,
        Func<DbContext, TState, CancellationToken, Task<TResult>> operation,
        Func<DbContext, TState, CancellationToken, Task<ExecutionResult<TResult>>>? verifySucceeded,
        CancellationToken cancellationToken = default)
        => Suspend
            ? operation(Dependencies.CurrentContext.Context, state, cancellationToken)
            : base.ExecuteAsync(state, operation, verifySucceeded, cancellationToken);
}

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions