public TimeoutInfo ResolveTimeoutInfo(object token)
        {
            TimeOutToken timeOutToken = (TimeOutToken)token;

            if (!_timeOutTokens.Contains(timeOutToken))
            {
                throw new Exception("Token not found in TimeOutService");
            }
            return(new TimeoutInfo(timeOutToken.Duration, timeOutToken.Duration - timeOutToken.RemainingTime));
        }
        public void Rearange(TimeSpan duration, object token)
        {
            TimeOutToken timeOutToken = (TimeOutToken)token;

            if (!_timeOutTokens.Contains(timeOutToken))
            {
                throw new Exception("Token not found in TimeOutService");
            }
            timeOutToken.RemainingTime = duration;
            timeOutToken.Duration      = duration;
        }
        public Promise TimeOut(TimeSpan duration, out object token)
        {
            Deferred     deferred     = new Deferred();
            TimeOutToken timeOutToken = new TimeOutToken
            {
                Deferred      = deferred,
                RemainingTime = duration,
                Duration      = duration
            };

            token = timeOutToken;
            _timeOutTokens.Add(timeOutToken);
            return(deferred.Promise());
        }