Система.Таймеры.Таймер Как узнать время, оставшееся до истечения

StackOverflow https://stackoverflow.com/questions/2278525

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Вдохновленный Сэмюэлем Неффом, я придумал решение без использования WinForms, расширив стандартную систему.Таймеры.Класс 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);
            }
        }
    }

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

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

TimeSpan t = DateTime.Now - StartTime;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top