c# timer windows-services elapsedtime system.timers.timer

c# - System.Timers.Timer Cómo obtener el tiempo restante hasta que transcurra



windows-services elapsedtime (3)

El temporizador incorporado no proporciona el tiempo restante hasta que transcurre. Tendrá que crear su propia clase que envuelva un temporizador y exponga esta información.

Algo como esto debería funcionar.

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

Con C #, ¿cómo puedo obtener el tiempo restante (antes de que ocurra el evento transcurrido) de un objeto System.Timers.Timer ?

En otras palabras, digamos que establezco el intervalo del temporizador en 6 horas, pero 3 horas más tarde, quiero saber cuánto tiempo queda. ¿Cómo obtendría el objeto temporizador para revelar este tiempo restante?


Soy consciente de que el tema tiene más de 3 años. Sin embargo, lo encontré mientras abordaba exactamente el mismo problema.

Inspirado por Samuel Neff, se me ocurrió una solución sin WinForms al extender la clase estándar de temporizadores System.Timers:

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

Espero que ayude.


Supongo que el mejor método es mantener la hora de inicio en una variable y luego calcular el tiempo transcurrido como

TimeSpan t = DateTime.Now - StartTime;