public long CheckRemaining()
        {
            var remaining = _targetTime - ThreadingHelper.Milliseconds(ThreadingHelper.TicksNow());

            if (remaining <= 0)
            {
                Finish(null);
                return(0);
            }
            return(remaining);
        }
 public bool Change(long dueTime)
 {
     if (Interlocked.CompareExchange(ref _status, _changing, _created) == _created)
     {
         _startTime  = ThreadingHelper.Milliseconds(ThreadingHelper.TicksNow());
         _targetTime = _startTime + dueTime;
         var wrapped = Interlocked.CompareExchange(ref _wrapped, null, null);
         if (wrapped == null)
         {
             return(false);
         }
         wrapped.Change(TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(-1));
         Volatile.Write(ref _status, _created);
         return(true);
     }
     return(false);
 }
 protected void Start(long dueTime)
 {
     _startTime  = ThreadingHelper.Milliseconds(ThreadingHelper.TicksNow());
     _targetTime = _startTime + dueTime;
     _wrapped    = new Timer(Finish, null, TimeSpan.FromMilliseconds(dueTime), TimeSpan.FromMilliseconds(-1));
 }