Планировщик задач на C# (.NET): обзор и примеры
В современной разработке на C# (.NET) часто возникает необходимость выполнять код по расписанию: отправлять email-рассылки, обновлять кэш, архивировать логи или запускать ETL-процессы. Для этого существуют специализированные библиотеки — планировщики задач (Job Schedulers). В этой статье мы рассмотрим три популярных решения: Quartz.NET, Hangfire и Coravel, а также приведём примеры их использования.
1. Quartz.NET — мощный и гибкий планировщик
Quartz.NET — это порт популярного Java-фреймворка Quartz. Он поддерживает сложные расписания с использованием cron-выражений, персистентность заданий в базе данных, кластеризацию и триггеры.
Установка
dotnet add package Quartz
Пример: простое задание с cron-расписанием
using Quartz;
using Quartz.Impl;
public class HelloJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
Console.WriteLine($"Привет! Время: {DateTime.Now}");
}
}
// Настройка планировщика
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = await schedulerFactory.GetScheduler();
// Определяем задание
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("helloJob", "group1")
.Build();
// Триггер: каждые 10 секунд
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.WithCronSchedule("0/10 * * * * ?") // каждые 10 секунд
.ForJob(job)
.Build();
await scheduler.ScheduleJob(job, trigger);
await scheduler.Start();
Особенности:
- Поддержка cron-выражений (например,
0 0 12 * * ?— каждый день в полдень). - Хранение заданий в ADO.NET (SQL Server, PostgreSQL, MySQL).
- Возможность динамического создания/удаления заданий.
- Кластеризация для отказоустойчивости.
2. Hangfire — простота и встроенный дашборд
Hangfire — это библиотека для выполнения фоновых задач с минимальной конфигурацией. Она предоставляет встроенный веб-дашборд для мониторинга, повторные попытки при ошибках и интеграцию с ASP.NET Core.
Установка
dotnet add package Hangfire
dotnet add package Hangfire.SqlServer # для хранения в SQL Server
Пример: отложенная и повторяющаяся задача
using Hangfire;
// Настройка в Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddHangfire(config =>
config.UseSqlServerStorage("connection_string"));
services.AddHangfireServer();
}
public void Configure(IApplicationBuilder app)
{
app.UseHangfireDashboard(); // /hangfire
// Повторяющаяся задача: каждые 5 минут
RecurringJob.AddOrUpdate(
"cleanup-cache",
() => Console.WriteLine("Чистка кэша..."),
"*/5 * * * *");
// Отложенная задача (через 1 час)
BackgroundJob.Schedule(
() => SendEmail("user@example.com"),
TimeSpan.FromHours(1));
}
public void SendEmail(string email)
{
Console.WriteLine($"Отправка email на {email}");
}
Преимущества:
- Встроенный дашборд (
/hangfire) для просмотра статуса задач. - Автоматические повторы при сбоях.
- Поддержка очередей (по умолчанию — Redis или SQL Server).
- Простая интеграция с ASP.NET Core через DI.
3. Coravel — лёгкий планировщик для .NET Core
Coravel — это минималистичная библиотека, которая не требует внешних зависимостей (кроме самой .NET). Она идеально подходит для небольших проектов, где не нужна персистентность.
Установка
dotnet add package Coravel
Пример: инвокация задачи по расписанию
using Coravel;
// В Program.cs (.NET 6+)
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScheduler();
var app = builder.Build();
// Настройка расписания
app.UseScheduler(scheduler =>
{
scheduler
.Schedule(async () =>
{
await Task.Delay(100);
Console.WriteLine($"Запуск задачи в {DateTime.Now}");
})
.EveryFiveMinutes() // каждые 5 минут
.PreventOverlapping(); // предотвратить перекрытие
});
app.Run();
Особенности: