C# System.Timers.Timer如何获取剩余时间,直到时间过去

C# System.Timers.Timer如何获取剩余时间,直到时间过去,c#,timer,windows-services,elapsedtime,system.timers.timer,C#,Timer,Windows Services,Elapsedtime,System.timers.timer,使用C#,如何从System.Timers.Timer对象获取剩余时间(在发生消逝事件之前) 换句话说,假设我将计时器间隔设置为6小时,但3小时后,我想知道还有多少时间。如何让timer对象显示剩余时间?内置计时器不会提供剩余时间,直到时间过去。您需要创建自己的类来包装计时器并公开此信息 这样的办法应该行得通 public class TimerPlus : IDisposable { private readonly TimerCallback _realCallback; p

使用C#,如何从
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 => _period;
    public DateTime Next => _next;
    public TimeSpan DueTime => _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();
}

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

TimeSpan t = DateTime.Now - StartTime;

我知道,这个话题已经有三年多的历史了。然而,我在处理完全相同的问题时遇到了它

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

我希望有帮助。

我同意。但是,他不得不检查山姆的努力;他写了一节课来帮助我。好极了。谢谢你们两位。除了电话之外,我还要感谢你们的努力。谢谢,你真好。我已经有了一个计算剩余时间的方法,但是我想用实际计时器对象本身的输出来确认它。糟糕的是,它不是天生提供的。是的,他写得也很快。令人印象深刻。塞缪尔,你能提供这个类的用法吗?我不确定如何将参数传递给构造函数。@HeseinBurg
TimerPlus
Timer
的替代品(这意味着您可以像在任何地方使用
Timer
一样使用
TimerPlus
)。它具有相同的功能和API。添加的是
Next
属性,它将始终返回下次触发的
DateTime