How to Run Code Daily at a Specific Time in C#: Part 2






4.33/5 (16 votes)
How to run code daily at a specific time in C#
Few months ago, I wrote a blog post about how to run code daily at a specific time. I didn't know that the post will be the most viewed post on my blog. Also, there were several questions how to implement the complete example. So today, I have decided to write another post, and extend my previous post in order to answer these questions as well as to generalize this subject into a cool demo called Scheduler DEMO.
The post is presenting simple Windows Forms application which calls a method for every minute, day, week, month or year. Also, the demo shows how to cancel the scheduler at any time.
The picture above shows a simple Windows Forms application with two numeric controls in which you can set starting hour and minute for the scheduler. Next, there is a button Start to activate timer for running code, as well as Cancel button to cancel the scheduler. When the time comes, the application writes the message on the Scheduler Log.
Implementation of the Scheduler
Scheduler is started by clicking the Start button which is implemented with the following code:
/// <summary>
/// Setting up time for running the code
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void startBtn_Click(object sender, EventArgs e)
{
//retrieve hour and minute from the form
int hour = (int)numHours.Value;
int minutes = (int)numMins.Value;
//create next date which we need in order to run the code
var dateNow = DateTime.Now;
var date = new DateTime(dateNow.Year, dateNow.Month, dateNow.Day, hour, minutes, 0);
listBox1.Items.Add("**********Scheduler has been started!*****");
//get nex date the code need to run
var nextDateValue=getNextDate(date,getScheduler());
runCodeAt(nextDateValue, getScheduler());
}
When the time is defined, then the runCodeAt
method is called which implementation can be like the following:
/// <summary>
/// Determine the timeSpan Delay must wait before running the code
/// </summary>
/// <param name="date"></param>
/// <param name="scheduler"></param>
private void runCodeAt(DateTime date,Scheduler scheduler )
{
m_ctSource = new CancellationTokenSource();
var dateNow = DateTime.Now;
TimeSpan ts;
if (date > dateNow)
ts = date - dateNow;
else
{
date = getNextDate(date, scheduler);
ts = date - dateNow;
}
//enable the progressbar
prepareControlForStart();
//waits for a certain time and runs the code,
//in the mean time, you can cancel the task at any time
Task.Delay(ts).ContinueWith((x) =>
{
//run the code at the time
methodToCall(date);
//setup call next day
runCodeAt(getNextDate(date, scheduler), scheduler);
},m_ctSource.Token);
}
The method above creates the cancelationToken
needed for cancel the scheduler, calculate timeSpan
– total waiting time, then when the time comes, call the method methodToCall
and calculate the next time for running the scheduler.
This demo also shows how to wait for a certain amount of time without blocking the UI thread.
The full demo code can be found on OneDrive.