System.Timers.Timer如何获得剩余时间直到Elapse

时间:2010-02-17 05:29:12

标签: c# timer windows-services elapsedtime system.timers.timer

使用C#,如何从System.Timers.Timer对象中获取剩余时间(在经过事件发生之前)?

换句话说,假设我将计时器间隔设置为6小时,但3小时后,我想知道还剩多少时间。如何让计时器对象显示此时间?

3 个答案:

答案 0 :(得分:31)

内置计时器不会提供剩余的时间。您需要创建自己的类来包装计时器并公开此信息。

这样的事情应该有效。

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

答案 1 :(得分:14)

我想最好的方法是将开始时间保存在变量中,然后将经过的时间计算为

TimeSpan t = DateTime.Now - StartTime;

答案 2 :(得分:13)

我知道,这个话题已经超过3年了。然而,当遇到完全相同的问题时,我遇到了它。

受Samuel Neff的启发,我通过扩展标准System.Timers.Timer类来提出一个无WinForms的解决方案:

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

我希望它有所帮助。