Scheduling Hangfire Jobs With Varying Schedules Using Cron Expressions

Scheduling your own background jobs in .NET can be a pain. If you’re feeling brave or rather ambitious, you could write your own scheduler using out of the box .NET framework components, or you could use a library like Hangfire.  Hangfire enables you to schedule jobs, and manages the execution and retry logic.   Scheduled jobs survive a process restart which is a nice bonus.

Recently I was developing an application with a requirement for recurring jobs. Users of the application were to be able to schedule jobs daily, weekly, monthly, as well as every three and four months.   I used Hangfire’s recurring job scheduler method for this.  This particular method uses CRON Expressions to specify the job schedule, and allows the most flexibility.   Cron is a little weird getting used to, but I found a great website with some simple guidance and an expression interpreter so you can test out your expressions.  Head on over to and you’ll find an online cron expression checker that parses your cron expression and tells you based on that expression, when your scheduled jobs will run next.  Its a beautiful thing.

There are five parts of a cron expression, and they’re explained pretty well on this site.  Here’s an excerpt:

“Reminder of the crontab format…
mm – the minute, a value between 0 and 59
hh – the hour, a value between 0 and 23
D – day of the month, between 1 and 31
M – month, a value between 1 and 12
DoW – day-of-the-week, 0-6 (0 = Sunday)

Each of the five items can be expressions…
A ‘*’ means use all values.
Multiples: e.g. every 20 mins would be ‘0,20,40’.
Range: e.g. hourly in the evening ’19-23′.
Every nth ‘0-23/n’, ‘*/2’ would be every other.
‘*/1’ is valid crontab syntax, but is flagged here as a possibly unintended entry.” 

Building off this format, you can schedule jobs to occur at varying intervals such as the following.  (I’ve got them all starting at 8AM but you can specify your own start time)

Weekly:                                00 08 * * 1

Every month:                     00 08 01 1,2,3,4,5,6,7,8,9,10,11,12 *

Every three months:      00 08 01 1-12/3 *

Every year:                          “00 08 01 1-12/12 *

Happy scheduling!