System.Timers.Timer How to get the time remaining until Elapse
Solution 1
The built-in timer doesn't provide the time remaining until elapse. You'll need to create your own class which wraps a timer and exposes this info.
Something like this should work.
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();
}
Solution 2
I am aware, that the topic is more than 3 years old. However I came across it while tackling exactly the same problem.
Inspired by Samuel Neff, I came up with a WinForms-less solution by extending the standard System.Timers.Timer class:
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);
}
}
I hope it helps.
Solution 3
I guess the best method is to hold the start time in a variable and then calculate the elapsed time as
TimeSpan t = DateTime.Now - StartTime;
Related videos on Youtube
Lonnie Best
Do your work willingly, as though you were serving the Lord himself, and not just your earthly master. -Colossians 3:23 The thing about quotes on the internet is that you cannot confirm their validity. -Abraham Lincoln
Updated on July 09, 2022Comments
-
Lonnie Best almost 2 years
Using C#, how may I get the time remaining (before the elapse event will occur) from a
System.Timers.Timer
object?In other words, let say I set the timer interval to 6 hours, but 3 hours later, I want to know how much time is remaining. How would I get the timer object to reveal this time remaining?
-
Lonnie Best about 14 yearsI agree. But, had to check Sam for his efforts; he wrote a class to help me. Super kind. Thank you both.
-
Lonnie Best about 14 yearsAbove and beyond the call, but checked you for your efforts. Thanks, you are very kind. I already have a method that will calculate how much time should be remaining, but wanted to confirm it with output from the actual timer object itself. To bad it isn't inherently provided.
-
Lonnie Best about 14 yearsYeah, he wrote that fast too. Impressive.
-
Hesein Burg almost 8 yearsSamuel, could you provide the usage of this class? I am unsure how to pass in the parameters to your constructor.
-
JamesUsedHarden almost 8 years@HeseinBurg
TimerPlus
is a drop-in replacement forTimer
(meaning you can useTimerPlus
as-is wherever you useTimer
). It has the same functionality and API. The addition is theNext
property which will always return theDateTime
that it will next be triggered.