2010-02-17 17 views
14

Wie kann ich mithilfe von C# die verbleibende Zeit (bevor das Ereignis abläuft) von einem System.Timers.Timer-Objekt erhalten?System.Timers.Timer Wie bekomme ich die verbleibende Zeit bis zum Ende?

Mit anderen Worten, sagen wir, ich setze das Timer-Intervall auf 6 Stunden, aber 3 Stunden später möchte ich wissen, wie viel Zeit noch bleibt. Wie würde ich das Timer-Objekt dazu bringen, diese verbleibende Zeit aufzudecken?

Antwort

27

Der integrierte Timer bietet nicht die verbleibende Zeit bis zum Ablauf. Sie müssen Ihre eigene Klasse erstellen, die einen Timer umschließt und diese Informationen verfügbar macht.

So etwas sollte funktionieren.

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

Über den Anruf hinaus, aber überprüft Sie für Ihre Bemühungen. Danke du bist sehr lieb. Ich habe bereits eine Methode, die berechnet, wie viel Zeit übrig bleiben sollte, aber wollte es mit der Ausgabe vom eigentlichen Timer-Objekt selbst bestätigen. Zu schlecht ist es nicht von Natur aus vorgesehen. –

+2

+1 Danke für diesen nützlichen Code, Sam! – BillW

+3

Ja, er hat das auch schnell geschrieben. Beeindruckend. –

11

Ich denke, die beste Methode ist, um die Startzeit in einer Variablen zu halten und dann die verstrichene Zeit zu berechnen, wie

TimeSpan t = DateTime.Now - StartTime; 
+1

Ich stimme zu. Aber, musste Sam für seine Bemühungen überprüfen; Er schrieb eine Klasse, um mir zu helfen. Super nett. Danke euch beiden. –

10

Ich bin mir bewusst, dass das Thema mehr als 3 Jahre alt ist. Ich stieß jedoch auf dasselbe Problem.

Inspiriert von Samuel Neff, kam ich durch die Erweiterung des Standard System.Timers.Timer-Klasse mit einer WinForms losen Lösung:

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

Ich hoffe, es hilft.

Verwandte Themen