Hangfire 1.7.0 is finally released with the whole bunch of new features and improvements for background processing, background and recurring jobs, SQL Server storage, .NET Core integration and interoperability between .NET platforms to provide a strong foundation for future features and extensions.

The most significant changes relate to SQL Server storage. It was greatly improved in this release to allow you to use it with larger workloads, and delay the transition to other storages or dedicated queues like MSMQ. Because every new storage in your environment significantly increase the overall complexity.

Please see overview of the 1.7.0 RC release for more details. And full release notes with all the changes available on GitHub Releases.


Please see the Upgrading Guide article for detailed instructions on how to upgrade, because some of the new features are disabled by default for compatibility reasons. Rolling upgrades are officially supported starting from this version. And the first step is to bump versions of the following packages, depending on which ones you use.

<PackageReference Include="Hangfire" Version="1.7.0" />
<PackageReference Include="Hangfire.Core" Version="1.7.0" />
<PackageReference Include="Hangfire.AspNetCore" Version="1.7.0" />
<PackageReference Include="Hangfire.SqlServer" Version="1.7.0" />
<PackageReference Include="Hangfire.SqlServer.Msmq" Version="1.7.0" />

If you have any issues with an upgrade process, please share your thoughts on GitHub Issues.


The goal number one is to improve the documentation. Project becomes more complex over the years due to backward compatibility, and there are some quirks that should be documented. Another aspect is the complexity of distributed processing topic itself, and there should be how-tos for common problems. And the hardest work is to document storage abstractions and processing model.

The major goal for the 2.0 release is to add async support for storage methods to play better with .NET Core’s application model, since thread pool’s worker thread play very important role there due to the absence of I/O completion port threads. Current release set the stage for this feature by adding async processes and common processing model for them, so the change will be relatively simple with async/await keywords.

Next big change is related with distributed lock scopes, and I’d like to change them from connection to transaction-based that will allow to avoid the need for some non-transactional updates in filters, and may even reduce the number of round-trips when releasing the locks.

After these important changes we can start to work on ecosystem and features without looking back.

Thank You! :heart:

ambroseya armandombi barclayadam BjoernHund burningice2866 cdschneider denis-ivanov EngelenH ericgreenmix faabergr gatis-ozols HolisticDeveloper hometoast jeroenvervaeke markalanevans mikechamberlain pieceofsummer robbendavid rsilvanet stevedesmond-ca tracstarr

First of all I want to thank Alexey Skalozub, Pauli Østerø, Hans Engelen, @tracstarr, @hometoast, Lucas Mendes Pereira and everyone who helped others on discussion forum and GitHub Issues to solve different problems.

Thank you Alice Brosey, Armando Bracho, Brian Baker, @gatis-ozols, Mike Chamberlain, Mark Evans, @robbendavid, Rick Faaberg and Steve Desmond for your work on documentation and help to make it better.

Thanks for code contributions to:

  • Adam Barclay for maintaining the Hangfire.Azure.ServiceBusQueue package for so long.
  • Alexey Skalozub for adding asynchronous checks for job cancellation when using regular CancellationToken; entry point for custom job naming strategies available for dashboard; JobDisplayNameAttribute class for displaying jobs in dashboard; Support for async jobs returning ValueTask<T>.
  • Björn Hund for adding callback method to allow to open the database with impersonation.
  • Christian Schneider for adding GetFirstByLowestScoreFromSet connection method overload that returns multiple items.
  • Denis Ivanov and Eric Green for adding an overloaded AddHangfire method with IServiceProvider parameter.
  • Jeroen Vervaeke for adding JobActivator.BeginScope method overload with the full PerformContext.
  • Mike Chamberlain for adding support for read-only view for dashboard.
  • Robson da Silva for adding storage property to control the job expiration time.

And last but not least, thanks to everyone for your suggestions, bug reports and feature requests. With your feedback the project becomes much better over the years.

Subscribe to monthly updates

Subscribe to receive monthly blog updates. Very low traffic, you are able to unsubscribe at any time.