Pregunta

Uso de C #, ¿en qué puedo obtener el tiempo restante (antes de que ocurra el evento transcurra) de un objeto System.Timers.Timer?

En otras palabras, dejar que digo fijo el intervalo del temporizador a 6 horas, pero 3 horas más tarde, me gustaría saber cuánto tiempo queda. ¿Cómo voy a conseguir el objeto de temporizador para revelar este tiempo restante?

¿Fue útil?

Solución

El temporizador incorporado no proporciona el tiempo restante hasta que transcurra. Tendrá que crear su propia clase, que se ajusta un temporizador y expone 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();
    }
}

Otros consejos

Soy consciente, de que el tema es más de 3 años de edad. Sin embargo, me encontré con ella mientras abordar exactamente el mismo problema.

Inspirado por Samuel Neff, me ocurrió con una solución WinForms-menos extendiendo la clase System.Timers.Timer estándar:

    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.

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

TimeSpan t = DateTime.Now - StartTime;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top