public void Execute(Func<bool> function, CancellationToken cancellationToken)
{
do
{
bool result = true;
while (result && !cancellationToken.IsCancellationRequested)
{
result = function();
}
IEnumerator<TimeSpan> enumerator = _backoffTimings.GetEnumerator();
enumerator.MoveNext();
TimeSpan currentWaitTime = enumerator.Current;
if (!result)
{
_logger?.Verbose("BackoffPolicy - backing off to {0}ms", currentWaitTime.TotalMilliseconds);
}
while (!result && !cancellationToken.WaitHandle.WaitOne(currentWaitTime))
{
result = function();
if (!result)
{
if (enumerator.MoveNext())
{
currentWaitTime = enumerator.Current;
}
}
}
}
while (!cancellationToken.IsCancellationRequested);
}
}