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

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

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

Начать курс

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

Особенности:

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