Планировщик задач на C# (.NET): Quartz.NET, Hangfire и Coravel

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Планировщик задач на 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                    

Рекомендаций