Планировщик задач на C# (.NET): Quartz.NET, Hangfire и Coravel
В современных .NET-приложениях часто требуется выполнять код не только по запросу пользователя, но и по расписанию: отправка email-рассылок, очистка базы данных, генерация отчётов, синхронизация с внешними API. Для этого используются планировщики задач (Job Schedulers). В этой статье мы рассмотрим три популярных инструмента для C# (.NET): Quartz.NET, Hangfire и Coravel, их особенности, примеры кода и сценарии использования.
Зачем нужен планировщик задач в .NET?
Планировщик задач позволяет:
- Выполнять фоновые задания в определённое время (например, каждый день в 8:00).
- Повторять задачи с заданным интервалом (каждые 5 минут).
- Обрабатывать очереди заданий, не блокируя основной поток приложения.
- Легко управлять задачами (добавлять, удалять, приостанавливать).
- Обеспечивать отказоустойчивость (повторные попытки при ошибках).
1. Quartz.NET — мощный и гибкий планировщик
Quartz.NET — это порт популярного Java-фреймворка Quartz для .NET. Он поддерживает сложные расписания (cron-выражения), кластеризацию, персистентность заданий в базу данных. Подходит для enterprise-проектов.
Установка
dotnet add package Quartz
dotnet add package Quartz.Extensions.Hosting
Пример: задача с cron-расписанием
using Quartz;
using Quartz.Impl;
using System.Threading.Tasks;
public class EmailJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
Console.WriteLine($"Отправка email в {DateTime.Now}");
// Логика отправки письма
await Task.CompletedTask;
}
}
// Настройка в Program.cs
var scheduler = await StdSchedulerFactory.GetDefaultScheduler();
await scheduler.Start();
var job = JobBuilder.Create<EmailJob>()
.WithIdentity("emailJob", "group1")
.Build();
var trigger = TriggerBuilder.Create()
.WithIdentity("emailTrigger", "group1")
.WithCronSchedule("0 0 8 * * ?") // Каждый день в 8:00
.Build();
await scheduler.ScheduleJob(job, trigger);
Особенности
- Поддержка cron-выражений (гибкое расписание).
- Кластеризация для распределённых систем.
- Персистентность (задачи сохраняются при перезапуске).
- Высокая производительность для тысяч задач.
2. Hangfire — простота и встроенный UI
Hangfire — это планировщик с минимальной конфигурацией и встроенной веб-панелью для мониторинга задач. Отлично подходит для небольших и средних проектов, где важна быстрая интеграция.
Установка
dotnet add package Hangfire
dotnet add package Hangfire.SqlServer (для хранения в БД)
Пример: простая задача с задержкой и повторением
using Hangfire;
using Hangfire.SqlServer;
// Настройка в Program.cs
GlobalConfiguration.Configuration
.UseSqlServerStorage("YourConnectionString");
app.UseHangfireServer();
app.UseHangfireDashboard(); // Доступ к /hangfire
// Создание задачи
BackgroundJob.Schedule(() => Console.WriteLine("Отложенная задача"), TimeSpan.FromMinutes(5));
RecurringJob.AddOrUpdate("daily-report", () => Console.WriteLine("Ежедневный отчёт"), Cron.Daily);
Особенности
- Встроенный веб-интерфейс для мониторинга (без дополнительных зависимостей).
- Поддержка очередей, повторных попыток и отложенных задач.
- Легко интегрируется с ASP.NET Core.
- Хранение задач в SQL Server, Redis, PostgreSQL.
3. Coravel — лёгкий и современный
Coravel — минималистичный планировщик для .NET, вдохновлённый Laravel. Не требует внешних зависимостей (кроме самого Coravel). Идеален для небольших приложений и микросервисов.
Установка
dotnet add package Coravel
Пример: планирование с помощью fluent-интерфейса
using Coravel;
// В Program.cs
builder.Services.AddScheduler();
var app = builder.Build();
app.UseScheduler(scheduler =>
{
scheduler.Schedule(() => Console.WriteLine("Каждую минуту"))
.EveryMinute();
scheduler