Introduction to Hangfire – opensource library for background task scheduling in .Net core

What is Hangfire?

Hangfire is an open source that schedules background jobs with simple implementation in .Net core. It is a reliable and persistent system with a monitoring facility.

How to use it?

1. Install Nuget Package

We can download the Hangfire package by running the following command in the Package Manager console,

PM> Install-Package Hangfire

2. Add Hangfire into the global configuration,

GlobalConfiguration.Configuration
    .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
    .UseSimpleAssemblyNameTypeSerializer()
    .UseRecommendedSerializerSettings()
    .UseSqlServerStorage("Database=Hangfire.Sample; Integrated Security=True;", new SqlServerStorageOptions
    {
        CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
        SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
        QueuePollInterval = TimeSpan.Zero,
        UseRecommendedIsolationLevel = true
    })
    .UseBatches()
    .UsePerformanceCounters();

3. We need to provide necessary background task settings and SQL DB (we can use Redis and InMemory as well) connectivity in the program.cs, and it will create its tables in SQL.

using System;
using Hangfire;
using Hangfire.SqlServer;
 
namespace ConsoleApplication2
{
    class Program
    {
        static void Main()
        {
            GlobalConfiguration.Configuration
                .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
                .UseColouredConsoleLogProvider()
                .UseSimpleAssemblyNameTypeSerializer()
                .UseRecommendedSerializerSettings()
                .UseSqlServerStorage("Database=Hangfire.Sample; Integrated Security=True;", new SqlServerStorageOptions
                {
                    CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
                    SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
                    QueuePollInterval = TimeSpan.Zero,
                    UseRecommendedIsolationLevel = true
                });

 
            BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));

 
            using (var server = new BackgroundJobServer())
            {
                Console.ReadLine();
            }
        }
    }
}

Benefits of Hangfire

We can do bulk sending like notifications, reports, and events.

It supports CRON Expression. ( command-line utility is a job scheduler on Unix-like operating systems)

We can send events in any interval, like minutes, hourly, daily, weekly, or yearly.

Supported Task Scheduling Types in Hangfire

Fire-and-forget

These jobs are executed only once and almost immediately after they are fired.

var jobId = BackgroundJob.Enqueue(

    () => Console.WriteLine("Fire-and-forget!"));

Delayed

Delayed jobs are executed only once too, but not immediately – only after the specified time interval.

var jobId = BackgroundJob.Schedule(
    () => Console.WriteLine("Delayed!"),
    TimeSpan.FromDays(7));

 Recurring

Recurring jobs are fired many times on the specified CRON schedule.

RecurringJob.AddOrUpdate(
    "myrecurringjob",
    () => Console.WriteLine("Recurring!"),
    Cron.Daily);

Continuations

Continuations are executed when the parent job has finished.

BackgroundJob.ContinueJobWith(
    jobId,
    () => Console.WriteLine("Continuation!"));

Batches

A batch is a group of background jobs created atomically.

var batchId = Batch.StartNew(x =>
{
    x.Enqueue(() => Console.WriteLine("Job 1"));
    x.Enqueue(() => Console.WriteLine("Job 2"));
});

Batch Continuations

Batch continuation is fired after all background jobs in a parent batch have finished.

Batch.ContinueBatchWith(batchId, x =>
{
    x.Enqueue(() => Console.WriteLine("Last Job"));
});

Background Process

Use them when you need to run background processes continuously throughout the lifetime of your application.

public class CleanTempDirectoryProcess : IBackgroundProcess
{
    public void Execute(BackgroundProcessContext context)
    {
        Directory.CleanUp(Directory.GetTempDirectory());
        context.Wait(TimeSpan.FromHours(1));
    }
}

Reference


Similar Articles