sooprise
sooprise

Reputation: 23177

Question About Timers And Variable Intervals

The point of this timer is to execute some code whenever it's midnight. So basically, the first interval will be between Now and midnight and all intervals following that will be 24hours.

Now that's all well and good, but I was wondering how this timer business works. Is the MyTimer.Interval recalculated each time the timer resets?

System.Timers.Timer MyTimer = new System.Timers.Timer();
MyTimer.Elapsed += new ElapsedEventHandler(TriggeredMethod);
MyTimer.Interval = [pseudocode]Time between now and midnight[/pseudocode];
MyTimer.Start();

EDIT:

I'm having trouble setting the Interval inside of my TriggerMethod. Where/how should I initiate the Timer so I don't get any context errors?

private void Form1_Load(object sender, EventArgs e)
{
System.Timers.Timer MyTimer = new System.Timers.Timer();
MyTimer.Elapsed += new ElapsedEventHandler(TriggeredMethod);
MyTimer.Start();
}

private void TriggerMethod(object source, ElapsedEventArgs e)
{
MyTimer.Interval = [pseudocode]Time between now and midnight[/pseudocode];
}

Upvotes: 4

Views: 2258

Answers (3)

jsight
jsight

Reputation: 28409

Make your timer fire once per hour, and then only do the actual work at midnight. And I also recommend using BeginInvoke to move the actual UI interaction onto the GUI thread.

Upvotes: 0

SLaks
SLaks

Reputation: 887195

The Interval property is the number of milliseconds between timer invocations.

To run the timer at midnight, you would need to change Interval in each Elapsed event to (int)(DateTime.Today.AddDays(1) - DateTime.Now).TotalMilliseconds.

To access the timer inside the Elapsed handler, you'll need to store the timer in a field in your class, like this:

System.Timers.Timer MyTimer
private void Form1_Load(object sender, EventArgs e)
{
    MyTimer = new System.Timers.Timer();
    //...
}

Note, by the way, that System.Timers.Timer will not fire on the UI thread.
Therefore, you cannot manipulate the form inside the Elapsed handler.
If you need to manipulate the form, you can either switch to System.Windows.Forms.Timer (which is less accurate) or call BeginInvoke.

Upvotes: 4

Brian Mains
Brian Mains

Reputation: 50728

after the first run, you would have to update the interval, subtracting the current time from midnight the following day and assigning to the interval; I do this for one of my batch processes, and it works well.

HTH.

Upvotes: 1

Related Questions