Запуск фоновых задач на C# с помощью HangFire
Запуск задач в фоне — достаточно распространенная проблема. Библиотека 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"));
Первая задача — это задача с отложенным стартом. Вторая — задача, которая выполнится только после завершения первой
Результат выполнения: