2010-02-17 3 views
14

Используя C#, как я могу получить оставшееся время (до события elapse) из объекта System.Timers.Timer?System.Timers.Timer Как получить оставшееся время до Elapse

Другими словами, скажем, я установил интервал таймера на 6 часов, но через 3 часа я хочу знать, сколько осталось времени. Как я могу получить объект таймера, чтобы показать это время?

ответ

27

Встроенный таймер не обеспечивает оставшееся время до истечения срока. Вам нужно создать свой собственный класс, который обертывает таймер и раскрывает эту информацию.

Что-то вроде этого должно работать.

public class TimerPlus : IDisposable 
{ 
    private readonly TimerCallback _realCallback; 
    private readonly Timer _timer; 
    private TimeSpan _period; 
    private DateTime _next; 

    public TimerPlus(TimerCallback callback, object state, TimeSpan dueTime, TimeSpan period) 
    { 
     _timer = new Timer(Callback, state, dueTime, period); 
     _realCallback = callback; 
     _period = period; 
     _next = DateTime.Now.Add(dueTime); 
    } 

    private void Callback(object state) 
    { 
     _next = DateTime.Now.Add(_period); 
     _realCallback(state); 
    } 

    public TimeSpan Period 
    { 
     get 
     { 
      return _period; 
     } 
    } 

    public DateTime Next 
    { 
     get 
     { 
      return _next; 
     } 
    } 

    public TimeSpan DueTime 
    { 
     get 
     { 
      return _next - DateTime.Now; 
     } 
    } 

    public bool Change(TimeSpan dueTime, TimeSpan period) 
    { 
     _period = period; 
     _next = DateTime.Now.Add(dueTime); 
     return _timer.Change(dueTime, period); 
    } 

    public void Dispose() 
    { 
     _timer.Dispose(); 
    } 
} 
+0

Выше и за пределами вызова, но проверили вас для ваших усилий. Спасибо, Вы очень добры. У меня уже есть метод, который будет вычислять, сколько времени должно быть оставлено, но хотел подтвердить его с помощью результата самого объекта самого таймера. Плохо это по своей сути не предоставляется. –

+2

+1 Спасибо за этот полезный код, Сэм! – BillW

+3

Да, он тоже написал это быстро. Впечатляет. –

11

Я думаю, лучший способ провести время начала в переменной, а затем вычислить истекшее время, как

TimeSpan t = DateTime.Now - StartTime; 
+1

Согласен. Но пришлось проверить Сэма за его усилия; он написал класс, чтобы помочь мне. Супер-вид. Спасибо вам обоим. –

10

Я знаю, что эта тема более 3-х лет. Однако я столкнулся с этим, решая точно такую ​​же проблему.

Вдохновленный Samuel Neff, я придумал WinForms-менее решения путем расширения стандартного класса System.Timers.Timer:

public class TimerPlus : System.Timers.Timer 
    { 
     private DateTime m_dueTime; 

     public TimerPlus() : base() 
     { 
      this.Elapsed += this.ElapsedAction; 
     } 

     protected new void Dispose() 
     { 
      this.Elapsed -= this.ElapsedAction; 
      base.Dispose(); 
     } 

     public double TimeLeft 
     { 
      get 
      { 
       return (this.m_dueTime - DateTime.Now).TotalMilliseconds; 
      } 
     } 

     public new void Start() 
     { 
      this.m_dueTime = DateTime.Now.AddMilliseconds(this.Interval); 
      base.Start(); 
     } 

     private void ElapsedAction(object sender, System.Timers.ElapsedEventArgs e) 
     { 
      if (this.AutoReset) 
      { 
       this.m_dueTime = DateTime.Now.AddMilliseconds(this.Interval); 
      } 
     } 
    } 

Я надеюсь, что это помогает.

Смежные вопросы