2010-02-17 10 views
14

Utilizzando C#, come posso ottenere il tempo rimanente (prima che si verifichi l'evento di durata) da un oggetto System.Timers.Timer?System.Timers.Timer Come ottenere il tempo rimanente fino a Elapse

In altre parole, diciamo che ho impostato l'intervallo del timer su 6 ore, ma 3 ore dopo, voglio sapere quanto tempo è rimasto. Come posso ottenere che l'oggetto del timer riveli questo tempo rimanente?

risposta

27

Il timer incorporato non fornisce il tempo rimanente prima della fine. Avrai bisogno di creare la tua classe che avvolge un timer e espone queste informazioni.

Qualcosa di simile dovrebbe funzionare.

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

Al di sopra e al di là della chiamata, ma controllato per i vostri sforzi. Grazie sei molto gentile. Ho già un metodo che calcolerà quanto tempo dovrebbe rimanere, ma volevo confermarlo con l'output dal vero oggetto timer stesso. A male non è fornito intrinsecamente. –

+2

+1 Grazie per questo utile codice, Sam! – BillW

+3

Sì, anche lui ha scritto così velocemente. Impressionante. –

11

Credo che il metodo migliore è quello di tenere il tempo di inizio in una variabile e quindi calcolare il tempo trascorso come

TimeSpan t = DateTime.Now - StartTime; 
+1

Sono d'accordo. Ma doveva controllare Sam per i suoi sforzi; ha scritto un corso per aiutarmi. Super gentile. Grazie ad entrambi. –

10

Sono consapevole che il tema è più di 3 anni. Tuttavia mi sono imbattuto mentre affrontavo esattamente lo stesso problema.

Ispirato da Samuel Neff, mi si avvicinò con una soluzione WinForms-less estendendo la classe System.Timers.Timer di serie:

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); 
      } 
     } 
    } 

spero che aiuta.

Problemi correlati