Getting Started with Cron.NET: Scheduling Tasks in .NET the Easy Way
What Cron.NET is
Cron.NET is a .NET library that parses cron expressions and schedules recurring jobs inside .NET applications. It provides a lightweight way to run code at specified times or intervals using standard cron syntax (seconds, minutes, hours, day-of-month, month, day-of-week).
Key features
- Cron expression support: Use familiar cron formats (including optional seconds field) to define schedules.
- Lightweight: Focused on parsing and next-run calculation rather than a full job server.
- Next-run calculation: Compute upcoming run times for a cron expression.
- Time zone handling: Support for scheduling in specific time zones.
- Integration-friendly: Can be used with timers, background services, or hosted services in ASP.NET Core.
When to use it
- You need to compute or validate cron schedules inside a .NET app.
- You want a small dependency for scheduling logic without a heavy job-processing framework.
- You run scheduled code inside a single app instance (not a distributed job server).
Quick setup (ASP.NET Core example)
- Add the package:
bash
dotnet add package Cronos
- Create a background service that uses a cron expression to wait until next occurrence:
csharp
using Cronos; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Hosting; public class CronBackgroundService : BackgroundService { private readonly CronExpression _cron = CronExpression.Parse(“0 */5 * * * ”); // every 5 minutes private readonly TimeZoneInfo _tz = TimeZoneInfo.Local; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { var next = _cron.GetNextOccurrence(DateTimeOffset.Now, tz); if (!next.HasValue) break; var delay = next.Value - DateTimeOffset.Now; if (delay > TimeSpan.Zero) await Task.Delay(delay, stoppingToken); // Run the scheduled work await DoWorkAsync(stoppingToken); } } private Task DoWorkAsync(CancellationToken ct) { // TODO: scheduled task logic return Task.CompletedTask; } }
- Register the service:
csharp
services.AddHostedService<CronBackgroundService>();
Example cron expressions
- Every minute:
* * * * - Every 5 minutes (with seconds):
0 */5 * * * * - Daily at 02:30:
30 2 * * * - Every Monday at 09:00:
0 9 * * 1
Tips and best practices
- Prefer hosted services in ASP.NET Core for long-running scheduled tasks.
- Handle overlaps: ensure tasks that may take longer than interval don’t run concurrently unless intended.
- Use time zones explicitly when scheduling time-specific jobs.
- Consider durability: for distributed or persistent job needs use a job server (e.g., Hangfire) instead of Cron.NET alone.
- Test cron expressions using online cron testers or Cronos’ GetNextOccurrence to ensure expected timings.
Troubleshooting
- If jobs run at unexpected times, verify the cron expression fields and time zone.
- For missed executions after downtime, decide whether to run missed jobs on startup or skip them.
- Long-running tasks: use cancellation tokens and consider queuing work instead of blocking the scheduler.
Further reading
- Cron expression reference (cron syntax details)
- Cronos GitHub repository for source and advanced API options
Leave a Reply