Hangfire 1.8.22

Hangfire

Official Site Latest version Downloads License LGPLv3 Coverity Scan

Build Status

  main dev
AppVeyor Windows Build Status Windows Build Status

Overview

Incredibly easy way to perform fire-and-forget, delayed and recurring jobs in .NET applications. CPU and I/O intensive, long-running and short-running jobs are supported. No Windows Service / Task Scheduler required. Backed by Redis, SQL Server, SQL Azure and MSMQ.

Hangfire provides a unified programming model to handle background tasks in a reliable way and run them on shared hosting, dedicated hosting or in cloud. You can start with a simple setup and grow computational power for background jobs with time for these scenarios:

  • mass notifications/newsletters
  • batch import from xml, csv or json
  • creation of archives
  • firing off web hooks
  • deleting users
  • building different graphs
  • image/video processing
  • purging temporary files
  • recurring automated reports
  • database maintenance
  • …and so on

Hangfire is a .NET alternative to Resque, Sidekiq, delayed_job, Celery.

Hangfire Dashboard

Installation

Hangfire is available as a NuGet package. You can install it using the NuGet Package Console window:

PM> Install-Package Hangfire

After installation, update your existing OWIN Startup file with the following lines of code. If you do not have this class in your project or don't know what is it, please read the Quick start guide to learn about how to install Hangfire.

public void Configuration(IAppBuilder app)
{
    GlobalConfiguration.Configuration.UseSqlServerStorage("<connection string or its name>");
    
    app.UseHangfireServer();
    app.UseHangfireDashboard();
}

Usage

This is an incomplete list of features; to see all of them, check the official site and the documentation.

Fire-and-forget tasks

Dedicated worker pool threads execute queued background jobs as soon as possible, shortening your request's processing time.

BackgroundJob.Enqueue(() => Console.WriteLine("Simple!"));

Delayed tasks

Scheduled background jobs are executed only after a given amount of time.

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

Recurring tasks

Recurring jobs have never been simpler; just call the following method to perform any kind of recurring task using the CRON expressions.

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

Continuations

Continuations allow you to define complex workflows by chaining multiple background jobs together.

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

Process background tasks inside a web application…

You can process background tasks in any OWIN-compatible application framework, including ASP.NET MVC, ASP.NET Web API, FubuMvc, Nancy, etc. Forget about AppDomain unloads, Web Garden & Web Farm issues – Hangfire is reliable for web applications from scratch, even on shared hosting.

app.UseHangfireServer();

… or anywhere else

In console applications, Windows Service, Azure Worker Role, etc.

using (new BackgroundJobServer())
{
    Console.WriteLine("Hangfire Server started. Press ENTER to exit...");
    Console.ReadLine();
}

Questions? Problems?

Open-source projects develop more smoothly when discussions are public.

If you have any questions, problems related to Hangfire usage or if you want to discuss new features, please visit the discussion forum. You can sign in there using your existing Google or GitHub account, so it's very simple to start using it.

If you've discovered a bug, please report it to the Hangfire GitHub Issues. Detailed reports with stack traces, actual and expected behaviours are welcome.

Please see the Extensions page on the official site.

Building the sources

Prerequisites:

  • Razor Generator: Required if you intend to edit the cshtml files.
  • Install the MSMQ service (Microsoft Message Queue Server), if not already installed.

Then, create an environment variable with Variable name Hangfire_SqlServer_ConnectionStringTemplate and put your connection string in the Variable value field. Example:

  • Variable name: Hangfire_SqlServer_ConnectionStringTemplate
  • Variable value: Data Source=.\sqlexpress;Initial Catalog=Hangfire.SqlServer.Tests;Integrated Security=True;

To build a solution and get assembly files, just run the following command. All build artifacts, including *.pdb files, will be placed into the build folder. Before proposing a pull request, please use this command to ensure everything is ok. Btw, you can execute this command from the Package Manager Console window.

build

To build NuGet packages as well as an archive file, use the pack command as shown below. You can find the result files in the build folder.

build pack

To see the full list of available commands, pass the -docs switch:

build -docs

Hangfire uses psake build automation tool. All psake tasks and functions defined in psake-build.ps1 (for this project) and psake-common.ps1 (for other Hangfire projects) files. Thanks to the psake project, they are very simple to use and modify!

Razor templates are compiled upon save with the Razor Generator Visual Studio extension. You will need this installed if you want to modify the Dashboard UI.

Reporting security issues

In order to give the community time to respond and upgrade we strongly urge you report all security issues privately. Please email us at security@hangfire.io with details and we will respond ASAP. Security issues always take precedence over bug fixes and feature work. We can and do mark releases as "urgent" if they contain serious security fixes.

License

Copyright © 2013-2025 Hangfire OÜ.

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this program. If not, see https://www.gnu.org/licenses/.

By submitting a Pull Request, you disavow any rights or claims to any changes submitted to the Hangfire project and assign the copyright of those changes to Hangfire OÜ.

If you cannot or do not want to reassign those rights (your employment contract for your employer may not allow this), you should not submit a PR. Open an issue and someone else can do the work.

This is a legal way of saying "If you submit a PR to us, that code becomes ours". 99.9% of the time that's what you intend anyways; we hope it doesn't scare you away from contributing.

No packages depend on Hangfire.

Release notes are available in our blog https://www.hangfire.io/blog/ Please see https://docs.hangfire.io/en/latest/upgrade-guides/upgrading-to-hangfire-1.8.html to learn how to upgrade.

1.8.22

Hangfire.Core

• Added – IGlobalConfiguration.UseNoOpLogProvider method to disable logging. • Changed – Un-deprecate interval methods in the Cron class, add remarks in docs instead. • Changed – Bump internalized version of Cronos to 0.11.1. • Changed – Bump internalized version of Microsoft.Owin to 4.2.3. • Fixed – Serialization of arrays of nested types SimpleAssemblyTypeSerializer. • Fixed – Remove wrong escaping characters in Portuguese translations on the "Servers" page. • Fixed – Properly remove registered IBackgroundProcessingServer instances on OWIN app shutdown. • Fixed – AspNetShutdownDetector for early ASP.NET shutdown detection is not working (regression from 1.7.30). • Project – Replace the netcoreapp3.1 target with the net8.0 one in tests.

Hangfire.SqlServer

• Fixed – InvalidCastException when creating a background job with Schema 5 (regression from 1.8.15). • Project – Replace the netcoreapp3.1 target with the net8.0 one in tests.

Hangfire.AspNetCore

• Added – MapHangfireDashboardWithNoAuthorizationFilters method, which does not include local-only filters. • Changed – Set 404 status code when MapHangfireDashboard is used and no dispatcher is found. • Fixed – InvalidOperationException upon receiving a request for 'hangfire/bootstrap.min.css.map'.

1.8.21

Hangfire.Core

• Added – FailedState.IncludeFileInfo to optionally show/hide line numbers in exceptions in Failed state. • Changed – Include line numbers for exceptions by default when available. • Fixed – Portuguese (Brazil) translations in Strings.pt-BR.resx (by @pedro-cons). • Fixed – Static BackgroundJob class always acquires the most current JobStorage.Current instance. • Fixed – Static RecurringJob class always acquires the most current JobStorage.Current instance.

Hangfire.SqlServer

• Added – SqlServerStorageOptions.DisableTransactionScope option for .NET Framework targets. • Project – Port Monitoring API tests from the Hangfire.InMemory storage for better coverage. • Project – Run tests for different targets in parallel with different databases.

1.8.20

Hangfire.Core

• Fixed – Glyphicons from Bootstrap are not displaying after upgrading to version 1.8.19.

1.8.19

Hangfire.Core

• Changed – Update Bootstrap to the custom version of 3.4.2 to avoid false alerts on unused features. • Fixed – Typos in Portuguese translation (by @VianaArthur). • Fixed – Unnecessary recurring job update transaction when nothing is changed after an error.

Hangfire.SqlServer

• Fixed – Sliding invisibility timeout isn't prolonged in lightweight servers, causing jobs to be restarted.

1.8.18

Hangfire.Core

• Added – DashboardOptions.ServerPossiblyAbortedThreshold to configure a custom threshold for "possibly aborted" warnings. • Fixed – Expired jobs are still shown on the "Retries" page in some cases. • Fixed – Issues with CultureInfo-related differences after upgrading to 1.8.15–1.8.17. • Fixed – Don't leak AsyncLocal values from synchronous background job methods. • Fixed – Don't throw an exception when passing the Job.Args property to the Job class' constructor. • Project – Make the lock file usable for both .NET 8.0 and .NET 9.0 builds. • Project – Make code generation for cshtml files working on newer platforms.

Hangfire.AspNetCore

• Fixed – Swallow possible ObjectDisposedException in the StopAsync method. • Fixed – Avoid NullReferenceException when LocalIpAddress or RemoteIpAddress is null.

1.8.17

Hangfire.SqlServer

• Fixed – InvalidCastException while fetching a job with older schemas regression from 1.8.16.

1.8.16

Hangfire.Core

• Changed – Include fewer stack frames in exceptions come from IServerFilter implementations. • Changed – Don't include file information in the ExceptionDetails property of a FailedState instance. • Changed – Switch back to CancellationEvent usage instead of CancellationToken.WaitHandle. • Fixed – Don't commit external transaction in the BackgroundJobStateChanger implementation. • Fixed – Use safe default serializer settings for Newtonsoft.Json 12.X and below. • Project – Fix builds for the net451 platform when using .NET 9.0. • Project – Significantly reduce execution time of unit tests in the RecurringJobSchedulerFacts class. • Project – Bump Microsoft.CodeAnalysis.NetAnalyzers package to version 9.0.0.

Hangfire.SqlServer

• Changed – Use vanilla ADO.NET when fetching a job in the SqlServerJobQueue implementation. • Fixed – SqlException: Must declare the scalar variable "@key" in delayed and recurring job schedulers. • Fixed – Decrease the LockTimeout time when calling the sp_getapplock procedure to 1 second for less blocking. • Project – Disable parallel tests execution when building under .NET 9.0. • Project – Run tests over the latest Microsoft.Data.SqlClient package and the net6.0 platform. • Project – Reduce execution time of integration tests. • Project – Disable PoolBlockingPeriod setting on AppVeyor to handle transient test failures.

1.8.15

Hangfire.Core

• Added – New AutomaticRetryAttribute.ExceptOn property to skip retries for specific exceptions. • Changed – Refactor filters pipeline to use less LINQ magic and fewer allocations. • Changed – Use GetCultureInfo instead of creating an instance in the CaptureCultureAttribute filter. • Changed – Cache some immutable data to avoid extra allocations. • Fixed – Improve loopback address detection (by @meziantou). • Fixed – Reformulate misleading error messages regarding retry timings (by @RGFuaWVs). • Fixed – Problem with missing localizations in the previous version. • Fixed – Don't hide exception details on Failed Jobs page when the exception message is empty. • Fixed – Problems with the first restore when using the build.bat command. • Fixed – Better display of canceled recurring jobs in dashboard. • Fixed – Less overall allocations with using static delegates and struct-based iterators. • Fixed – Improve precision of some diagnostic messages in the wait protection logic. • Fixed – Make all private and internal classes sealed to improve code consistency. • Fixed – Less overall pressure on garbage collector.

Hangfire.SqlServer

• Changed – Use query template caching based on schema name to avoid excessive string allocations. • Changed – Use static callbacks almost anywhere to avoid unnecessary delegate allocations. • Changed – Use QuerySingle* or ReadSingle* where possible to avoid allocating lists. • Changed – Unify DbCommand and DbParameter creation logic to improve code consistency.

1.8.13 and 1.8.14

Hangfire.Core

• Changed – Partial cache for serialization and deserialization in InvocationData to produce less strings. • Changed – Add caching for default type serializer and resolver. • Changed – Don't let JobFilter-related logic to show up in profilers. • Changed – Modify IProfiler to be less allocatey for diagnostic purposes that almost never run. • Changed – Prefer using CancellationToken.WaitHandle again, since early .NET Core days are gone. • Changed – Fewer allocations when working with IStateHandler collections in a state machine. • Fixed – Redirect the "System.Private.Xml.Linq" assembly to the "System.Xml.Linq" one for better interoperability. • Fixed – Don't throw KeyNotFoundException when recurring job is malformed. • Fixed – Proper relative path calculation in UrlHelper.To for OWIN-based Dashboard UI (by @LordJZ). • Fixed – Typo in the Turkish localization file (by @ismkdc). • Project – Switch to a modern PowerShell 7+ to speed up SignPath installation on AppVeyor.

Hangfire.SqlServer

• Changed – Limit polling queries when queues are empty with a semaphore for all configurations. • Changed – Use per-queue signaling for same-process workers, instead of having a global signal. • Fixed – Don't silently truncate queue names, throw an exception instead. • Project – Decrease delays in SQL Server-related tests to complete them faster.

1.8.12

Hangfire.Core

• Added – MaxDegreeOfParallelismForSchedulers experimental server option if supported by storage. • Added – Experimental support for parallel execution of the delayed job scheduler. • Added – Experimental support for parallel execution of the recurring job scheduler. • Fixed – Recurring job is scheduled to the past after recovering from error with AddOrUpdate. • Fixed – AddOrUpdate triggers execution of a recurring job, even if its next execution is in the future. • Fixed – Two very minor errors in the Swedish localization file (by @Uglack).

Hangfire.SqlServer

• Fixed – Populate InvocationData and LoadException properties in JobDetails method results.

1.8.11

Hangfire.Core

• Changed – Add icons and fix metadata for NuGet packages. • Changed – Bump ILRepack to version 2.0.27 to avoid problems with internalizing. • Fixed – "Type exists in both Cronos and Hangfire.Core" exception.

1.8.10

Hangfire.Core

• Changed – Added Norwegian translations for new keys (by @khellang). • Changed – Update Brazilian Portuguese translation (by @HugoAlames). • Changed – Bump Cronos dependency to version 0.8.3.

Hangfire.AspNetCore

• Fixed – Don't check HasStarted in Response.WriteAsync to avoid breaking dispatchers.

Hangfire.SqlServer

• Changed – Bump Dapper for the netstandard2.0 platform to version 2.1.28. • Changed – Bump Dapper for net451 and netstandard1.3 platforms to version 1.60.6.

Hangfire.Core, Hangfire.NetCore, Hangfire.AspNetCore, Hangfire.SqlServer, Hangfire.SqlServer.Msmq

• Project – Enable NuGet package and DLL signing with a company certificate. • Project – Require NuGet package signature validation on restore for dependencies. • Project – Add HangfireIO as a package owner.

1.8.9

Hangfire.Core

• Changed – Use Environment.MachineName as a server name if other environment vars aren't available. • Changed – Bump the Cronos package version from 0.7.1 to 0.8.1. • Changed – Improve portuguese translations (by @filipe-silva). • Fixed – Possible NullReferenceException on the Deleted Jobs page (regression from 1.8.7). • Project – Enable full source link support with embedded symbols and repository-based sources. • Project – Enable repeatable package restore using a lock file. • Project – Run unit tests against the net6.0 platform. • Project – Modernise the build system and clean up the build scripts.

Hangfire.SqlServer

• Project – Enable full source link support with embedded symbols and repository-based sources. • Project – Enable repeatable package restore using a lock file. • Project – Run unit tests against the net6.0 platform.

Hangfire.NetCore

• Project – Enable full source link support with embedded symbols and repository-based sources. • Project – Enable repeatable package restore using a lock file.

Hangfire.AspNetCore

• Fixed – Don't attempt to write response headers when response has already started (by @maliming). • Project – Enable full source link support with embedded symbols and repository-based sources. • Project – Enable repeatable package restore using a lock file.

1.8.7

Hangfire.Core

• Added – Allow using macro expressions like @hourly for recurring jobs (by @MuhamedAbdalla). • Added – Show storage time in page footer when supported by storage implementation. • Added – Show duration and latency columns separately on the Succeeded Jobs page when supported. • Added – Show the exception column on the Deleted Jobs page when available and supported by storage. • Changed – Reduce package size by stripping unnecessary locales in Moment.js. • Changed – Bump Microsoft.Owin package to version 4.2.2. • Changed – Log a warning message when a server listens to unsupported queue names (by @MuhamedAbdalla). • Changed – Use storage time, if available, to show delay warnings in the Dashboard UI. • Fixed – Proper rendering of generic arguments on the Job Details page (by @olivermue). • Fixed – Language inconsistency in the Dashboard UI related to date/time description. • Fixed – Big stack traces take too long time to be formatted. • Fixed – Don't throw NullReferenceException from the Scheduled Jobs page when there's a job with missing data. • Fixed – Don't throw NullReferenceException from the Processing Jobs page when there's a job with missing data. • Fixed – CSS for Enqueued and Deleted state cards in dark theme. • Fixed – Log errors instead of throwing an exception when a particular table can't be cleaned. • Fixed – Avoid logging fatal exceptions when stopping a faulting background process. • Fixed – Don't display checkboxes in the Dashboard UI when job details can’t be fetched. • Fixed – Scrollbars in WebKit-based browsers are now dark in dark mode. • Project – Disable tests for netcoreapp1.0 and netcoreapp2.1 targets since they aren't supported in AppVeyor. • Project – Add a net6.0 target for unit tests instead of the removed ones. • Project – Modernise projects and build environments to use the newest features.

Hangfire.SqlServer

• Changed – Avoid throwing an exception when a connection string has duplicate property names. • Project – Disable tests for netcoreapp1.0 and netcoreapp2.1 targets since they aren't supported in AppVeyor. • Project – Add a net6.0 target for unit tests instead of the removed ones. • Project – Modernise projects and build environments to use the newest features.

1.8.6

• Changed – Update jQuery library in Dashboard UI to version 3.7.1. • Changed – Mark all types in Hangfire.Annotations with EditorBrowsableAttribute(Never). • Changed – Change state card colors for the Awaiting state to match the Scheduled state. • Fixed – Exception when deserializing an instance of the AutomaticRetryAttribute class from JSON. • Fixed – Add serialization-related constructors for all the exception classes. • Fixed – Use invariant culture or ordinal comparisons for internal strings. • Fixed – Use invariant culture when formatting key names for metrics. • Fixed – Use CurrentCulture instead of CurrentUICulture when displaying time. • Project – Enable running static analysis by Coverity Scan weekly. • Project – Enable mandatory static analysis by the Microsoft.CodeAnalysis.NetAnalyzers package. • Project – Change MSBuild path when building using newer .NET SDKs for Razor views.

Hangfire.SqlServer

• Fixed – Exception in Dashboard UI when schema version is not present in a database. • Fixed – DbCommand resource leak when releasing a lock detected by static analysis. • Fixed – Don't add SQL Server-related metrics multiple times in Dashboard UI.

Hangfire.NetCore

• Fixed – Include assembly information to the Hangfire.NetCore assembly.

1.8.5

Hangfire.Core

• Added – Possibility to inform a FaviconPath on DashboardOptions (by @cezar-pimentel). • Fixed – Inability to restore a disabled recurring job, regression in version 1.8.3. • Fixed – Make it possible to serialize the AutomaticRetryAttribute filter to JSON.

Hangfire.SqlServer

• Fixed – "Query processor could not produce a query plan" when removing expired counters in Schema 5.

1.8.4

Hangfire.Core

• Added – Pass server id from a worker to the PerformContext.ServerId property available in filters. • Fixed – Send heartbeats until full background processing server shutdown.

Hangfire.NetCore

• Changed – Send the stop signal earlier in the shutdown pipeline when hosting in .NET Core 3.1 or higher. • Changed – Set processing server to null in hosted service to avoid ObjectDisposedException. • Fixed – Other IHostedService implementations can block Hangfire server from being stopped.

1.8.3

Hangfire.Core

• Changed – Allow to configure MaxLinesInStackTrace for a particular FailedState instance. • Fixed – Remove job id from schedule when it's not in the Scheduled state for some reason. • Fixed – Missing invocations of recurring jobs when the new "Ignorable" option is used. • Fixed – Make DisableConcurrentExecutionAttribute and LatencyTimeoutAttribute serializable.

1.8.2

Hangfire.Core

• Changed – Disable transactional job creation feature appeared in 1.8.0. • Fixed – "Can not start continuation XXX" error when storage supports transactional job creation.

Hangfire.SqlServer

• Fixed – InvalidOperationException with new dashboard metrics when a database has multiple data/log files.

1.8.1

Hangfire.Core

• Added – MisfireHandlingMode.Ignorable to avoid scheduling recurring jobs on missed schedules. • Added – Support disabling dark mode via the DashboardOptions.DarkModeEnabled property. • Changed – Remove the 1-hour limitation for the WithJobExpirationTimeout configuration method. • Fixed – Add missing UseDefaultCulture configuration method overloads. • Fixed – Add missing UseDashboardStylesheet and UseJobDetailsRenderer configuration methods. • Fixed – Give even more space for identifiers on the Recurring Jobs page. • Fixed – state-card-state-active color is not very dark (by @coolhome). • Fixed – Slightly change chart proportions to fit 4K in Dashboard UI.

Hangfire.SqlServer

• Fixed – Blocked workers regression since 1.7.33 when using multiple servers inside a process. • Fixed – Target schema version is less than the current schema version error. • Fixed – Implement database metrics without the need for additional permissions. • Fixed – Use the forceseek table hint whenever possible to avoid performance drops.

Hangfire.NetCore

• Fixed – Add net461 target for Hangfire.NetCore package to avoid missing method exceptions.

1.8.0

Hangfire.Core

• Breaking – Dropped the NET45 platform target in favor of the NET451 target to support Visual Studio 2022.

• Added – Introduce the Job.Queue property, so jobs now can have their own queue specified. • Added – Method overloads to create background jobs directly with a custom default queue. • Added – Method overloads to create recurring jobs directly with a custom default queue. • Added – IBackgroundJobClient.Create method overloads with the new queue parameter. • Added – Allow to filter exception types in AutomaticRetryAttribute by using the new OnlyOn property. • Added – DeletedState now has the persisted Exception property populated after a failure. • Added – JobContinuationOptions.OnlyOnDeletedState to create continuations after a failure. • Added – Exception job parameter is passed to continuation when UseResultsInContinuations method is used. • Added – FromExceptionAttribute to deal with an antecedent exception in a background job continuation. • Added – Make it possible to specify multiple JobContinuationOptions values for a continuation. • Added – BackgroundJobServerOptions.IsLightweightServer option to run a server with no storage processes. • Added – Ability to use custom formattable resource identifiers for the DisableConcurrentExecution filter. • Added – Pass ServerId to FailedState instances to simplify the debugging on different servers. • Added – Allow to pass job parameters when creating a job (by @brian-knoll-micronetonline). • Added – MisfireHandlingMode.Strict to create a job for each missed recurring job occurrence. • Added – Support for default culture and UI culture via the UseDefaultCulture configuration method. • Added – Introduce the captureDefault parameter in the CaptureCulture filter. • Added – IGlobalConfiguration.UseFilterProvider extension method to unify the configuration. • Added – Built-in Remove method for JobFilterCollection to remove global filters based on their type. • Added – CompatibilityLevel.Version_180 flag to avoid storing culture parameters when they are the same as the default ones. • Changed – Create job atomically when Transaction.CreateJob feature is supported by the storage. • Changed – Query time from storage in recurring and delayed schedulers when supported by storage. • Changed – Move job to the DeletedState instead of SucceededState when its invocation was canceled by a filter. • Changed – Speedup delayed jobs when a custom default queue is specified by avoiding extra state transition. • Changed – Use UI culture from CurrentCulture parameter when CurrentUICulture one is missing. • Changed – Increase the default value for the BackgroundJobServerOptions.StopTimeout to 500 ms. • Deprecated – AddOrUpdate overloads with optional params defined in the RecurringJobManagerExtensions class. • Deprecated – AddOrUpdate overloads with optional parameters defined in the RecurringJob class. • Deprecated – AddOrUpdate method overloads with no recurringJobId parameter. • Deprecated – RecurringJobOptions.QueueName property, new methods should be used instead. • Breaking – Dropped NET45 platform target in favor of NET451 target to support Visual Studio 2022.

Dashboard UI • Added – Dark mode support for Dashboard UI depending on the system settings (by @danillewin). • Added – Dashboard UI now has a full-width layout to display more data (by @danillewin). • Added – Allow to add custom JavaScript and CSS files to the Dashboard UI via the DashboardRoutes class. • Added – DefaultRecordsPerPage property on the DashboardOptions class (by @PaulARoy). • Added – IGlobalConfiguration.UseJobDetailsRenderer method for custom renderers for the Job Details page. • Added – Display deleted jobs in the Realtime and History graphs when supported by storage. • Added – IGlobalConfiguration.UseDashboardMetrics extension method to pass multiple metrics at once. • Added – State renderer for the DeletedState to display its new exception property. • Added – Support for new MonitoringApi methods for the Awaiting Jobs page. • Changed – Make it possible to display methods of non-loaded jobs in the Dashboard UI when supported by storage. • Changed – Improved display of realtime chart with more accents on failed and deleted jobs. • Changed – Don't display the queue name in the state transition list when it's the default one. • Changed – Display scheduled job count when the enqueued count is zero on the main metric.

Extensibility • Added – Factory, StateMachine, and Performer properties to context classes to avoid injecting services. • Added – Allow to pass custom data to ApplyStateContext and ElectStateContext instances. • Added – Preserve custom data dictionary between the entire filter chain. • Added – Allow to pass a transaction to background job state changer when new methods are implemented. • Changed – Ignore some members when serializing a JobFilterAttribute instance to decrease the payload size.

Storage • Added – Virtual JobStorage.GetReadOnlyConnection method intended to return JobStorageConnection for replicas. • Added – Virtual JobStorage.HasFeature method for querying optional features. • Added – The JobStorageFeatures class to avoid using magic strings in storage features. • Added – Optional GetSetCount, GetSetContains, and GetUtcDateTime methods for the JobStorageConnection class. • Added – Optional AcquireDistributedLock and RemoveFromQueue methods for the JobStorageTransaction class. • Added – Optional CreateJob and SetJobParameter methods for the JobStorageTransaction class. • Added – Optional ParametersSnapshot property for BackgroundJob and JobData classes to minimize roundtrips in the future. • Added – Support for transactional acknowledgment using a new storage method for better handling some data loss scenarios. • Added – Fetch Retries and Awaiting metrics in StatisticsDto properties when supported by storage. • Added – The JobStorageMonitor class with more available methods for the new features. • Changed – Allow to query job parameters without additional roundtrip when supported by storage. • Changed – Expose state data dictionaries in list DTOs when supported by storage. • Changed – Rely on storage indexing with the Monitoring.AwaitingJobs feature.

Internals • Added – IBackgroundProcess.UseBackgroundPool now allows to pass thread configuration logic. • Added – BackgroundJobServerOptions.WorkerThreadConfigurationAction option for custom thread configuration. • Changed – Allow changing queues on the fly with custom worker configuration. • Changed – Avoid storage roundtrip to query job data in worker, take data from previous state change. • Changed – FromParameterAttribute-based logic now always overwrites arguments, even with non-null values. • Changed – Turn the JobContinuationOptions enum into flags while still possible. • Changed – Re-implement TaskExtensions.WaitOneAsync only with the RegisterWaitForSingleObject method. • Changed – ServerHeartbeatProcess now uses ThreadPriority.AboveNormal to prioritize heartbeats.

Hangfire.NetCore

• Added – IApplicationBuilder.UseHangfireServer that accepts custom factory for IBackgroundProcessingServer. • Added – net451 and netstandard1.3 targets for the package. • Changed – Use netstandard2.1 target instead of netcoreapp3.0 for the package. • Changed – Send the "stop" signal earlier when the host supports .NET Standard 2.1. • Changed – Don't throw ObjectDisposedException when hosted service is disposed twice.

Hangfire.AspNetCore

• Breaking – Make the package to be dependent on Hangfire.NetCore and use the same types. • Added – IApplicationBuilder.UseHangfireServer that accepts custom factory for IBackgroundProcessingServer.

Hangfire.SqlServer

• Breaking – Prioritise Microsoft.Data.SqlClient package over System.Data.SqlClient one. • Breaking – Dropped the NET45 platform target in favor of the NET451 target to support Visual Studio 2022.

• Added – Schema 8 migration with fixed JobQueue.Id column to use the bigint type. • Added – Schema 9 migration that creates an index for the State.CreatedAt column. • Added – Automatic client package detection based on available types, preferring System.Data.SqlClient (by @0xced). • Added – SqlServerStorageOptions.DbProviderFactory option to use a custom provider factory. • Added – Clean up of old state entries of a non-finished job when InactiveStateExpirationTimeout is set. • Added – TryAutoDetectSchemaDependentOptions option to automatically enable options based on the schema. • Added – Optional experimental transactional acknowledge for SQL Server (UseTransactionalAcknowledge option). • Added – Implement the Connection.GetUtcDateTime feature to make work the new changes in schedulers. • Added – SqlServerStorage.SchemaVersion metric for Dashboard UI. • Added – DefaultQueueProvider option to specify a custom default queue provider. • Changed – Remove dependency on System.Data.SqlClient for Hangfire.SqlServer (by @0xced). • Changed – Set default value for the QueuePollInterval option to TimeSpan.Zero. • Changed – Polling delay when QueuePollInterval is set to zero now defaults to 200 ms. • Changed – Sliding invisibility timeout-based fetching method is now used by default with a 5-minute timeout. • Changed – Use command batching by default with a 5-minute maximum timeout. • Changed – Enable the UseRecommendedIsolationLevel option by default. • Changed – GetJobData now populates the JobData.ParametersSnapshot property to avoid additional roundtrips. • Changed – Display scheduled and processing jobs in ascending order in Dashboard UI. • Changed – Implement the Transaction.AcquireDistributedLock feature. • Changed – Implement the GetSetCount.Limited feature. • Changed – Implement the GetSetContains feature. • Changed – Bump the internal version of Dapper to 2.0.123. • Changed – Enable common metrics for SQL Server storage to be shown by default. • Changed – Enable the Monitoring.AwaitingJobs feature for SQL storage. • Deprecated – UsePageLocksOnDequeue option is now obsolete and doesn't affect anything.

Hangfire.SqlServer.Msmq

• Breaking – Dropped the NET45 platform target in favor of the NET451 target to support Visual Studio 2022.

.NET Framework 4.5.1

.NET Standard 1.3

.NET Standard 2.0

Version Downloads Last updated
1.8.22 1 12/10/2025
1.8.21 1 12/13/2025
1.8.20 0 05/16/2025
1.8.19 0 05/16/2025
1.8.18 1 12/10/2025
1.8.17 0 12/03/2024
1.8.16 0 11/27/2024
1.8.15 0 10/23/2024
1.8.14 1 12/13/2025
1.8.12 0 04/03/2024
1.8.11 0 02/23/2024
1.8.10 0 02/12/2024
1.8.9 0 01/24/2024
1.8.7 0 12/29/2023
1.8.6 0 10/18/2023
1.8.5 0 08/11/2023
1.8.4 0 07/27/2023
1.8.3 1 12/13/2025
1.8.2 0 05/26/2023
1.8.1 0 05/18/2023
1.8.0 0 04/28/2023
1.8.0-rc4 1 12/14/2025
1.8.0-rc2 1 12/10/2025
1.8.0-beta4 1 12/12/2025
1.8.0-beta3 1 12/13/2025
1.8.0-beta1 1 12/11/2025
1.7.37 0 04/08/2024
1.7.36 0 06/29/2023
1.7.35 0 05/18/2023
1.7.34 1 12/11/2025
1.7.33 0 01/31/2023
1.7.32 0 11/21/2022
1.7.31 0 08/19/2022
1.7.30 2 12/13/2025
1.7.29 0 05/23/2022
1.7.28 0 12/18/2021
1.7.27 0 11/03/2021
1.7.26 0 10/27/2021
1.7.25 1 12/09/2025
1.7.24 0 06/28/2021
1.7.23 0 05/28/2021
1.7.22 1 12/11/2025
1.7.21 2 12/10/2025
1.7.20 1 12/14/2025
1.7.19 2 12/13/2025
1.7.18 1 12/13/2025
1.7.17 1 12/10/2025
1.7.16 0 10/14/2020
1.7.15 0 10/08/2020
1.7.14 1 12/13/2025
1.7.13 0 09/15/2020
1.7.12 0 07/24/2020
1.7.11 0 04/15/2020
1.7.10 0 04/02/2020
1.7.9 1 12/12/2025
1.7.8 0 12/05/2019
1.7.7 0 10/22/2019
1.7.6 0 08/05/2019
1.7.5 0 07/18/2019
1.7.4 0 06/28/2019
1.7.3 0 05/23/2019
1.7.2 0 04/29/2019
1.7.1 0 04/16/2019
1.7.0 0 03/29/2019
1.6.30 0 04/29/2021
1.6.29 0 04/15/2020
1.6.28 1 12/13/2025
1.6.27 0 06/27/2019
1.6.26 0 05/23/2019
1.6.25 3 12/10/2025
1.6.24 0 03/27/2019
1.6.23 1 12/14/2025
1.6.22 1 12/10/2025
1.6.21 0 11/01/2018
1.6.20 0 07/31/2018
1.6.19 0 04/06/2018
1.6.18 0 04/05/2018
1.6.17 0 09/19/2017
1.6.16 0 09/02/2017
1.6.15 0 08/08/2017
1.6.14 0 06/16/2017
1.6.13 2 12/11/2025
1.6.12 0 03/22/2017
1.6.11 0 03/14/2017
1.6.10 0 03/13/2017
1.6.9 0 03/02/2017
1.6.8 0 12/21/2016
1.6.7 0 11/25/2016
1.6.6 0 10/13/2016
1.6.5 0 09/24/2016
1.6.4 0 08/30/2016
1.6.3 0 08/19/2016
1.6.2 1 12/13/2025
1.6.1 0 07/27/2016
1.6.0 1 12/11/2025
1.5.9 1 12/11/2025
1.5.8 0 06/17/2016
1.5.7 0 05/30/2016
1.5.6 0 04/22/2016
1.5.5 0 04/14/2016
1.5.4 0 03/22/2016
1.5.3 0 11/06/2015
1.5.2 0 10/15/2015
1.5.1 0 10/14/2015
1.5.0 1 12/11/2025
1.4.7 1 12/12/2025
1.4.6 1 12/13/2025
1.4.5 0 07/24/2015
1.4.4 0 07/23/2015
1.4.3 0 05/27/2015
1.4.2 0 05/06/2015
1.4.1 0 04/14/2015
1.3.4 0 02/04/2015
1.3.3 0 01/28/2015
1.3.2 0 01/27/2015
1.3.1 0 01/13/2015
1.3.0 1 12/14/2025
1.2.2 1 12/10/2025
1.2.1 1 12/12/2025
1.2.0 0 11/17/2014
1.1.1 0 09/05/2014
1.1.0 0 09/03/2014
1.0.2 0 07/01/2014
1.0.1 1 12/14/2025
1.0.0 0 06/30/2014
0.9.1 0 06/12/2014
0.9.0 0 06/07/2014
0.8.3 0 05/23/2014
0.8.2 0 05/21/2014
0.8.1 1 12/10/2025
0.8.0 1 12/14/2025
0.7.5 0 04/10/2014
0.7.4 0 04/07/2014
0.7.3 0 04/04/2014
0.7.2 0 04/04/2014
0.7.1 0 04/01/2014
0.7.0 0 03/22/2014
0.6.2 0 01/28/2014
0.6.1 0 01/27/2014
0.6.0 0 01/27/2014
0.5.2 0 11/19/2013
0.5.1 0 11/12/2013
0.5.0 0 11/10/2013