Thread sleep/wait until a new day

finoutlook picture finoutlook · Sep 16, 2011 · Viewed 18.1k times · Source

I'm running a process in a loop which has a limit on the number of operations it does per day. When it reaches this limit I've currently got it checking the the time in a loop to see if it a new date.

Would the best option be to:

  • Keep checking the time every second for new date
  • Calculate the number of seconds until midnight and sleep that length of time
  • Something else?

Answer

Dan Herbert picture Dan Herbert · Sep 16, 2011

Don't use Thread.Sleep for this type of thing. Use a Timer and calculate the duration you need to wait.

var now = DateTime.Now;
var tomorrow = now.AddDays(1);
var durationUntilMidnight = tomorrow.Date - now;

var t = new Timer(o=>{/* Do work*/}, null, TimeSpan.Zero, durationUntilMidnight);

Replace the /* Do Work */ delegate with the callback that will resume your work at the specified interval.

Edit: As mentioned in the comments, there are many things that can go wrong if you assume the "elapsed time" an application will wait for is going to match real-world time. For this reason, if timing is important to you, it is better to use smaller polling intervals to find out if the clock has reached the time you want your work to happen at.

Even better would be to use Windows Task Scheduler to run your task at the desired time. This will be much more reliable than trying to implement it yourself in code.