public async Task ExecuteAsync(Func <CancellationToken, Task <bool> > function, CancellationToken cancellationToken, Action shutdownAction = null)
        {
            if (_delayOnExecute)
            {
                await _taskDelay.Delay(_interval, cancellationToken);
            }
            bool shouldContinue = !cancellationToken.IsCancellationRequested;

            while (shouldContinue)
            {
                shouldContinue = await function(cancellationToken);

                if (shouldContinue)
                {
                    try
                    {
                        await _taskDelay.Delay(_interval, cancellationToken);
                    }
                    catch (TaskCanceledException)
                    {
                    }

                    shouldContinue = !cancellationToken.IsCancellationRequested;
                }
            }

            shutdownAction?.Invoke();
        }
        public async Task ExecuteAsync(Action <CancellationToken> action, CancellationToken cancellationToken, Action shutdownAction = null)
        {
            if (_delayOnExecute)
            {
                await _taskDelay.Delay(_interval, cancellationToken);
            }

            while (!cancellationToken.IsCancellationRequested)
            {
                using (CancellationTokenSource timeLimitedTask = new CancellationTokenSource(_interval))
                {
                    await Task.WhenAll(_threadPoolExecuter.Run(() => action(cancellationToken), timeLimitedTask.Token), _taskDelay.Delay(_interval, cancellationToken));
                }
            }

            shutdownAction?.Invoke();
        }