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();
        }