public async Task ExecuteAsync(Func<Task<bool>> function, Action shutdownAction, CancellationToken cancellationToken) { _shutdownAction = shutdownAction; _cancellationToken = cancellationToken; bool shouldContinue = true; do { bool didWork = await function(); if (!didWork) { shouldContinue = await Backoff(); } else { _backoffIndex = -1; } if (_cancellationToken.IsCancellationRequested) { shouldContinue = false; } } while (shouldContinue); _shutdownAction?.Invoke(); }