private async Task RunBackgroundService(CancellationToken cancellationToken)
        {
            await Task.Yield();

            try
            {
                await _BackgroundService.Execute(cancellationToken);
            }
            catch (TaskCanceledException)
            {
            }
            catch (Exception ex)
            {
                _Logger.LogException(ex);
                _Logger.LogError(
                    $"background service '{_TypeHelper.NameOf(_BackgroundService.GetType())}' threw an exception, terminating program");

                // TODO: Still do this?
                _ApplicationLifetimeManager.SignalGracefulTermination();
            }
        }
        public async Task Execute(CancellationToken cancellationToken)
        {
            int restartCount = 0;

            while (true)
            {
                try
                {
                    if (restartCount > 0)
                    {
                        _Logger.LogDebug($"restart-attempt #{restartCount} for background service {_TypeHelper.NameOf(_DecoratedService.GetType())}");
                    }

                    await _DecoratedService.Execute(cancellationToken);

                    if (restartCount > 0)
                    {
                        _Logger.LogDebug($"background service {_TypeHelper.NameOf(_DecoratedService.GetType())} terminated normally");
                    }

                    return;
                }
                catch (TaskCanceledException)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    _Logger.LogException(ex);

                    restartCount++;

                    TimeSpan restartDelay = GetRestartDelay(restartCount);
                    _Logger.LogVerbose(
                        $"background service {_TypeHelper.NameOf(_DecoratedService.GetType())} terminated due to an exception, restarting it in {restartDelay.Humanize()}");

                    await Task.Delay(restartDelay, cancellationToken).NotNull();
                }
            }
        }