/// <inheritdoc/>
        public IDisposable RunIn(TimeSpan timespan, Action action)
        {
            var result = new DisposableTimer(_cancelTimers.Token);

            Observable.Timer(timespan, _reactiveScheduler)
            .Subscribe(
                _ => RunAction(action),
                () => _logger.LogTrace("Exiting scheduled run at {Timespan}", timespan)
                , result.Token);
            return(result);
        }
        /// <inheritdoc/>
        public IDisposable RunEvery(TimeSpan timespan, Action action)
        {
            var result = new DisposableTimer(_cancelTimers.Token);

            Observable.Interval(timespan, _reactiveScheduler)
            .Subscribe(
                _ => RunAction(action),
                _ => _logger.LogTrace("Exiting timer using trigger with span {Span}",
                                      timespan)
                , result.Token);

            return(result);
        }
        /// <inheritdoc/>
        public IDisposable RunAt(DateTimeOffset timeOffset, Action action)
        {
            var result = new DisposableTimer(_cancelTimers.Token);

            Observable.Timer(
                timeOffset,
                _reactiveScheduler)
            .Subscribe(
                _ => RunAction(action),
                () => _logger.LogTrace("Exiting timer that was scheduled at {TimeOffset}",
                                       timeOffset),
                result.Token
                );

            return(result);
        }
        /// <inheritdoc/>
        public IDisposable RunEvery(TimeSpan period, DateTimeOffset startTime, Action action)
        {
            var result = new DisposableTimer(_cancelTimers.Token);

            Observable.Timer(
                startTime,
                period,
                _reactiveScheduler)
            .Subscribe(
                _ => RunAction(action),
                () => _logger.LogTrace("Exiting timer that was scheduled at {StartTime} and every {Period}",
                                       startTime, period),
                result.Token
                );

            return(result);
        }