Запуск фоновых задач на C# с помощью HangFire

04.09.2019 at 13:34

Запуск задач в фоне — достаточно распространенная проблема. Библиотека HangFire не только сама отслеживает очередь таких задач, но и позволяет настраивать расписание выполнения. Задачи хранятся в хранилище (например SQL), что позволяет не терять запущенные задачи даже с рестартом приложения.

Для начала добавим необходимые пакеты

dotnet add package HangFire 
dotnet add package Hangfire.MemoryStorage

второй пакет — in memory хранилище задач. Вряд ли на продакшене имеет смысл его использовать, но для изучения оно идеально подходит.

Теперь сконфигурируем хранилище

GlobalConfiguration.Configuration.UseMemoryStorage();

Теперь запустим сервис выполнения задач

using (new BackgroundJobServer())
{
...
}

весь дальнейший код по созданию задач будет находиться внутри этого блока.

Запустим несколько задач

BackgroundJob.Enqueue(() => Console.WriteLine("task 1"));
BackgroundJob.Enqueue(() => Console.WriteLine("task 2"));
BackgroundJob.Enqueue(() => Console.WriteLine("task 3"));
RecurringJob.AddOrUpdate(() => 
    Console.WriteLine("minutely task"), Cron.Minutely);

первые три задачи выполнятся сразу, последняя запущена так, что будет выполняться каждую минуту

результат работы:

как видно на скриншоте, порядок задач не гарантирован.

Теперь создадим еще пару задач

var jobId = BackgroundJob.Schedule(() => 
    Console.WriteLine("Delayed task"), TimeSpan.FromSeconds(10));
BackgroundJob.ContinueJobWith(jobId, () => 
    Console.WriteLine("Continuation task"));

Первая задача — это задача с отложенным стартом. Вторая — задача, которая выполнится только после завершения первой

Результат выполнения:

Tags: