使用C#,我如何从System.Timers.Timer对象中获取剩余时间(在逾期事件发生之前)?
换句话说,假设我将计时器间隔设置为6小时,但是3小时后,我想知道还剩多少时间。我该如何让计时器对象显示这个剩余时间?
换句话说,假设我将计时器间隔设置为6小时,但是3小时后,我想知道还剩多少时间。我该如何让计时器对象显示这个剩余时间?
内置计时器不提供到期前剩余的时间。您需要创建自己的类,将计时器封装并公开此信息。
像这样的东西应该可以工作:
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();
}
我知道这个话题已经超过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 => (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;
TimerPlus
是Timer
的即插即用替代品(这意味着您可以在任何使用Timer
的地方直接使用TimerPlus
)。它具有相同的功能和 API。新增的是Next
属性,它将始终返回下一次触发的DateTime
。 - Samuel NeffNext
和DueTime
在下一个计时器滴答之前都会是错误的。 - Samuel Neff