public static ValueTask<IEnumerable<TResult>> KeepTrying<TResult>(Func<IEnumerable<TResult>> func, int? expectedNumber = null, bool? expectedBool = null, bool handle result = true) where TResult : IReturnedValueFromDb
var pipeline = new ResiliencePipelineBuilder<IEnumerable<TResult>>()
.AddRetry(new RetryStrategyOptions<IEnumerable<TResult>>()
ShouldHandle = new PredicateBuilder<IEnumerable<TResult>>().Handle<NotFoundException>()
if (expectedNumber != null)
return result.First().ReturnedNumber != expectedNumber;
if (expectedBool != null)
return result.First().ReturnedBool != expectedBool;
throw new InvalidOperationException("Can not determine result");
Delay = TimeSpan.FromSeconds(2)
return ValueTask.FromResult(pipeline.Execute(func));
public async Task MyTest()
var myNumber = await Waiter.KeepTrying<DatabaseReturnValues>(() => DB.GetMyNumber("some param"), expectedNumber: 1);
Assert.That(myNumber.First().ReturnedInteger, Is.EqualTo(1));