An easy and reliable way to perform fire-and-forget, delayed and recurring long-running, short-running, CPU or I/O intensive tasks inside ASP.NET application. No Windows Service / Task Scheduler required. Even ASP.NET is not required.
Backed by Redis, SQL Server, SQL Azure or MSMQ. This is a .NET alternative to Sidekiq, Resque and Celery.
See the version list below for details.
Install-Package HangFire -Version 1.6.28
dotnet add package HangFire --version 1.6.28
<PackageReference Include="HangFire" Version="1.6.28" />
paket add HangFire --version 1.6.28
Backported from 1.7:
• Fixed – `CultureInfo.InvariantCulture` is now restored properly in background jobs.
• Fixed – Use `LazyThreadSafetyMode.PublicationOnly` to avoid caching "JobStorage.Current is null" exceptions.
Backported from 1.7:
• Fixed – Don't leak a `DbConnection` instance when an exception occurs while trying to open it.
Backported from 1.7:
• Fixed – Cannot resolve the collation conflict in `CountersAggregator`.
• Fixed – Set `SqlParameter` types explicitly to not to duplicate query plans and and avoid conversion issues.
• SECURITY – Use `HtmlEncode` in all remaining places in Dashboard UI to prevent XSS attacks.
• Fixed – Buggy `CancellationToken` consumers now can't cause memory leaks related to token registrations.
• Fixed – `PreserveCulture` filter logs a message instead of throwing an error when it can't find the culture.
• Fixed – Uninitialized continuation shouldn't cause exception when completing an antecedent job.
• Fixed – Validate `JobExpirationCheckInterval` option to avoid exceptions in runtime (by @carlowahlstedt).
• Fixed – Don't throw an exception, when current schema version is higher than expected.
• Added – Slow log to see warning messages when filters or queries take more than 1 minute.
• Fixed – Catching `DistributedLockTimeoutException` based on resource name in schedulers (by @bogdandanielb).
• Fixed – Serilog context property name does not follow Serilog convention (by @pobiega).
• Fixed – Add more guards against `NullReferenceException` on Recurring Jobs page.
• Fixed – Don't handle recurring jobs created by newer version of Hangfire.
• Fixed – Could not load type `Microsoft.***.FormattedLogValues` in ASP.NET Core 3.0.
• Fixed – Make `GetRangeFromSet` to be forward compatible with the 1.7.0 schema.
• Fixed – Changed some SQL queries to not to cause index scans when using 1.7.0 schema.
• Added – Ability to use custom type resolvers to modify the type de-serialization logic.
• Fixed – `JobLoadException` when processing jobs in .NET Framework, which were created in .NET Core.
• Fixed – `JobLoadException` when jobs reside in a signed assembly and a new version is deployed.
• Fixed – Don't produce extra logging message when there's an exception in a worker.
• Fixed – Ensure form values are properly returned when there are different versions of Microsoft.Owin (by @DC-jc).
• Fixed – Dashboard fails with 404 "Not Found" error if there's a trailing slash for some reason.
• Added – Connection factory overload for the `SqlServerStorage` class (by @chinwobble).
• Fixed – Inability to use package with Azure's managed service identity (by using a connection factory).
• Fixed – High CPU usage and long response time when accessing Failed jobs page with Linux stack traces.
• Fixed – RecurringJobScheduler may block server shutdown and cause distributed lock to be abandoned.
• Fixed – Change locking scheme in the `Connection.SetRangeInHash` method to avoid deadlocks.
• Fixed – Null-based implementation of the `IAntiforgery` interface doesn't lead to an exception.
• SECURITY – Add "robots" meta tag to ensure browser don't index dashboard pages.
• SECURITY – Add support for antiforgery validation to prevent CSRF attacks (requires configuration).
• Fixed – Perform state change retries using a fresh connection when job's distributed lock may be abandoned.
• Fixed – Disallow transitions to the Failed state on retries that bypass all the filters.
• Fixed – Remove possible rare CPU spikes due to the use of `CancellationToken.WaitHandle`.
• Fixed – Avoid resolving types and methods for logging in static constructors that may lead to process shutdown.
• Fixed – Prevent Recurring jobs dashboard from throwing `NullReferenceException` (by @mattkwiecien).
• Fixed – Replace wall clocks with monotonic ones when calculating local timeouts.
• Fixed – Change logger initialization to be deterministic and predictable by using instance fields.
• Fixed – Make `_currentLogProvider` field access to use volatile reads/writes.
• Fixed – Typo in `NotSupportedException`'s message (by @benrick).
• Fixed – Typo on the Failed jobs page (by @gareth-evans).
• Fixed – Remove the synthetic limitation to support Azure SQL Management instance (by @TimSQL).
• SECURITY – Use ASP.NET Core's built-in antiforgery validation to prevent CSRF attacks.
• Fixed – NullReferenceException in JobMethodCallRenderer regression appeared in 1.6.18.
• Fixed – "String or binary data would be truncated" exception when state reason is too long.
• Fixed – Command handling in batch mode now stops after the first error due to "XACT_ABORT ON".
• Fixed – Make SqlCommandBatch disposable to dispose all the commands.
• Added – Add on option to remove the storage connection string from the footer (by @sandorfr).
• Added – Add Dashboard UI Resource zh-TW (by @crablin).
• Fixed – OutOfMemoryException in dashboard when arguments are too big.
• Fixed – DisplayNameAttribute doesn't work when using dashboard in .NET Core.
• Fixed – Update rickshaw css to match the js version (by @pieceofsummer).
• Fixed – Bad exception when Job.FromExpression fails to resolve method for explicit interface implementations (by @f00).
• Fixed – Missing intValue-values in "/stats" endpoint (by @pieceofsummer).
• Fixed – Logging doesn't work with log4net integration in .NET Core (by @evollu).
• Fixed – Fix nuspec pointing to version of Newtonsoft.Json that does not exist (by @mvestergaard)
• Fixed – Server start time has a bad tooltip position (by @pieceofsummer).
• Fixed – Prevent connection string from blowing mobile page layout (by @pieceofsummer).
• Fixed – Number of recurring jobs per page is now correct (by @pieceofsummer).
• Project – Get rid of all the compile-time warnings (by @liakamp).
• Project – More details for build instructions for the project (by @kristofferjalen).
• Project – Unable to build project with space in folder path (by @stefanviberg).
• Added – More Hangfire-related services are now registered in an IoC container (by @pieceofsummer).
• Fixed – Queue parameter is ignored in .NET Core when creating a job (by @pieceofsummer).
• Fixed – Fix issue with configuration block not called on .NET Core (by @pieceofsummer).
• Fixed – Rare deadlocks in SQL Server caused by the SetRangeInHash command.
• Added – `SqlServerStorageOptions.CommandBatchMaxTimeout` parameter to enable batching in transactions.
• Fixed – Timeout exceptions when there are a lot of large concurrent transactions by using the new batching method.
• Fixed – Distributed locks are safe now even in very unreliable networks and after network blips.
• Performance – Greatly decreased the number of connections required to process background jobs.
• Performance – Significantly decrease the number of roundtrips required to commit a transaction.
• Fixed – Unexpected `DateTime` and `DateTime?` serialization issues in background job arguments (by @plaisted).
• Fixed – `DistributedLockTimeoutException` in some background processes now logged with "DEBUG" level instead of "ERROR".
• Fixed – `ElmahLogProvider` to show errors when using SQL log (by @francnuec).
• Fixed – Last execution field isn't shown on recurring jobs page, when background job has already expired.
• Fixed – `Hangfire.SqlServer` assembly doesn't include version in the `netstandard` target.
• Fixed – Lower the number of requests, when trying to acquire a distributed lock.
• Fixed – Problems with continuations and batch continuations, when using existing `SqlConnection` instance.
• Fixed – Distributed locks were silently released, when passing explicit closed connection to a storage.
• Fixed – `KeyNotFoundException` errors on various dashboard pages don't appear anymore (by @benjymous).
• Fixed – "Cannot release the application lock because it is not currently held" exceptions, when connection was closed.
• Fixed – Allow to use zero timeout for SQL Server-based distributed locks.
• Fixed – Timeout exceptions that's caused by SQL Server's thread pool starvation, caused by sp_getapplock.
• Fixed – Antecedent background job is constantly failing, when its continuation hasn't been fully created.
• Added – `SqlServerStorageOptions.SlidingInvisibilityTimeout` to fetch jobs without using transaction.
• Fixed – Transaction log is full due to 'ACTIVE_TRANSACTION' by enabling to use new non-transactional fetch.
• Fixed – `SqlServerJobQueueMonitoringApi` can't cause READ UNCOMMITTED isolation level to leak on SQL Server 2012 or earlier.
• Fixed – Add missing `SqlServerStorage(DbConnection, SqlServerStorageOptions)` constructor.
• Fixed – Continuation is fired on a wrong queue, when parent job is finished before the creation.
• Fixed – Impossible to intercept failed state transition before `AutomaticRetryAttribute`.
• Fixed – Fixed translation in Chinese localization on home page (by @JustinChia).
• Fixed – Don't throw `NullReferenceException`, when state has changed during query on Processing page.
• Fixed – `CreateBatchFailedException`, when batch creation takes longer than 1 hour.
• Fixed – Types are resolved using the `GetServiceOrCreateInstance` method (by @Tsabo).
• Fixed – Don't hide errors occurred while running SQL migrations.
• Fixed – `KeyNotFoundException` when accessing Deleted Jobs page in Dashboard.
• Fixed – `SqlServerDistributedLock` leaks connections, when lock acquisition is failed.
• Fixed – Buggy state filters may cause background job to be infinitely retried.
• Fixed – Transient exception during Processing-Succeeded state transition may cause unexpected retry.
• Fixed – `NullReferenceException` in dashboard when OWIN's or ASP.NET Core's `User` is `null`.
• Fixed – Regression related to missing CSS and JS resources in dashboard appeared in 1.6.10.
• Fixed – Duplicate job continuations aren't added anymore, when outer transaction has failed.
• Fixed – Existing duplicate continuations don't lead to `ArgumentException`: the same key already added.
• Fixed – Replace inline script, because it may violate the Content Security Policy (by @Beczka).
• Fixed – Don't skip records in RecurringJobsPage (by @reaction1989).
• Fixed – `TimeoutException` on large arguments or large batches via `SqlServerOptions.CommandTimeout`.
• Fixed – `Cron.MonthInterval` now returns correct CRON expression.
• Fixed – Throw `NotSupportedException` early, when arguments contain delegate or expression.
• Fixed – Connection and distributed lock kept longer than necessary in `RecurringJobScheduler`.
• Fixed – Use local date/times everywhere in Dashboard UI.
• Fixed – Scheduled column title is now displaying correctly in Dashboard UI.
• Fixed – Typo "Nexts jobs" should be "Next jobs" in Dashboard UI (by @danielabbatt).
• Fixed – Use `long` where possible instead of `int` for background job identifiers, full support will be in 1.7.0.
• Fixed – ArgumentException when using complex arguments in generic methods like "IList<T>" (by @aidmsu).
• Fixed – Generic arrays like "T" aren't supported in background job arguments (by @aidmsu).
• Fixed – Wrong choice of the overload when multiple methods match the given arguments (by @aidmsu).
• Fixed – Null values for arguments when there are errors during the JSON deserialization.
• Fixed – Window resize cause errors and uncontrolled growth of event and poll listeners (by @Yarmonov).
• Fixed – HtmlHelper.ToHumanDuration incorrectly formats fractional seconds (by @pieceofsummer).
• Fixed – Exception in Dashboard UI when CRON expression is null by an accident (by @aidmsu).
• Fixed – Error in Dashboard UI when rendering an array that contains a null element (by @djfoz).
• Fixed – Inconsistent constructors' accessibility for different context classes (by @pieceofsummer).
• Fixed – Decrease the max default workers count to "20" in tests (by patrykpiotrmarek).
• Fixed – Inconsistent EOL characters in some files of a project (by @aidmsu).
• Fixed – Make Queue name accessible from RecurringJobDto (by @swordfish6975).
• Fixed – Validation added to avoid "An invalid application lock time-out" exceptions (by t0mburton).
• Fixed – Parameterless AspNetCoreJobActivator.BeginScope method now returns a correct instance (by @pieceofsummer).
• Fixed – Hangfire.Core, Hangfire.SqlServer and Hangfire.SqlServer.Msmq marked as CLS-compliant.
• Fixed – Generic methods cause ArgumentNullException when scoped variable is used in expression.
• Fixed – SqlServerJobQueue class doesn't use obsolete InvisibilityTimeout parameter anymore.
• Added – Chinese language to Dashboard UI (by @andy-zhouyou).
• Changed – Default upper limit of worker number is 20.
• Changed – Default value for DashboardJobListLimit is now 10000.
• Fixed – Deserialization exception in continuations, when TypeNameHandling.All option is used (by @MaksimSimkin).
• Fixed – I18N is not working, because there are no localized resources in NuGet packages.
• Fixed – Infinite redirect loops, when authenticated, but not authorized user accesses Dashboard UI.
• Fixed – "The type ... exists in both..." issue when building Hangfire, related to Newtonsoft.Json.
• Fixed – Use the given type's method, when scope variable is passed to a job expression.
• Fixed – Very rare resource leaks detected by Coverity Scan.
• Fixed – Different timeout issues after making performance optimizations.
• Fixed – SQL timeouts while getting a connection, when using default settings and >= 8 CPU cores.
• Fixed – ExpirationManager is bloated by SqlError instances, when there are a lot of messages from server.
• Fixed – Counters query returned inconsistent results during CountersAggregator executions.
• Performance – Added missing NOLOCK hint for monitoring queries when using SqlServer-based queues.
• Performance – ExpirationManager is forced to use index seek operations for cascade deletions.
• Performance – CountersAggregator now uses clustered index scan to issue less logical reads.
• Performance – Paging queries in dashboard now use CTEs to utilize less logical reads.
• Fixed – `SqlConnection` object leaks when using nested distributed locks (in batches and continuations).
• Fixed – Add missing `RecurringJob.AddOrUpdate` method overloads to prevent CS4014 warnings.
• Fixed – `ToGenericTypeString` method now handles types with no namespace correctly.
• Fixed – Prevent `ExpirationManager`'s command from timing out, when there are a lot of records.
• Fixed – `CountersAggregator` issue introduced in 1.6.2, that causes slow record aggregation.
• Fixed – Add `XLOCK` hint for `CountersAggregator` query to prevent deadlocks on lock escalation.
• Fixed – Prevent MSMQ transactions from timing out after 1 minute of processing.
• Changed – Recurring job page displays now raw cron strings, descriptions are in tooltips.
• Fixed – Return non-highlighted stack trace, when parsing takes too long, instead of throwing an exception.
• Fixed – Dashboard UI works correctly again, when IE 11 is in the Compatibility Mode.
• Fixed – Long method names now don't push tables out of the boundaries now.
• Changed – `JobExpirationCheckInterval` property value now defaults to 30 minutes.
• Fixed – Excessive blocking when expiring records in `State` and `JobParameters` tables.
• Fixed – Migration script `Install.sql` was deadlocked by itself, leading to errors on startup.
• Fixed – Public MSMQ queue paths are parsed correctly now, when determining the queue length.
• Added – Automatic unit tests execution for .NET Core on Windows, Linux and OS X using AppVeyor and Travis CI.
• Fixed – `DateTime` deserialization issues on .NET Core platform.
• Fixed – Fixed UI command behaviour, buttons can only be pressed once per command (by @mahoneyj2).
• Fixed – `TypeInitializationException` when using Serilog appeared in version 1.6.0.
• Fixed – Cron format strings for intervals are specified correctly now (by @stevetsang).
• Fixed – `NullReference` on Job Details page when background job has null value for `IEnumerable` argument.
• Fixed – Don't skip symbols when publishing NuGet packages.
• Fixed – Use GUID identifier when can't determine the host name.
• Fixed – Add missing `GetHttpContext` extension method for the .NET Core platform.
• Added – .NET Core support for Hangfire.Core and Hangfire.SqlServer packages (`netstandard1.3` target).
• Added – Ability to create jobs based on async methods, they are awaited by a worker (by @tuespetre).
• Added – Access to background job context from the `JobActivator.BeginScope` method.
• Added – Add LatencyTimeoutAttribute To delete jobs if timeout is exceeded (by @Excommunicated).
• Added – Ability to change statistics polling interval in dashboard (by @tristal).
• Added – Non-blocking `BackgroundJobServer.SendStop` method, that requests for a shutdown.
• Added – `BackgroundJobServerOptions.ServerName` option is back.
• Added – `IDashboardAuthorizationFilter` interface that makes `IAuthorizationFilter` obsolete.
• Added – Show background job continuations on Job Details page.
• Added – Multilanguage support in Dashboard via resource files (by @Elph).
• Added – Spanish localization for the Dashboard UI (by @Elph).
• Added – Enable backtracking from background job to recurrent job (by @teodimache).
• Added – Cron expressions for regular intervals for the `Cron` class (by @geirsagberg).
• Added – `IRecurringJobManager` interface for the `RecurringJobManager` class (by @arnoldasgudas).
• Added – Abstractions for Dashboard UI to decouple it from OWIN.
• Changed – Make the realtime/history graph to use localized dates on hover (by @Elph).
• Changed – Make graph tooltip also localized using data-attributes (by @Elph).
• Changed – Dashboard metric's title now contains the ResourceKey instead the title (by @Elph).
• Changed – Job Details page was redesigned to be more clean with less colors.
• Changed – Update jQuery to 2.1.4 and rickshaw.js to 1.5.1.
• Changed – Update NCrontab to 3.1.0.
• Changed – Update CronExpressionDescriptor to 1.17.
• Fixed – `ToGenericTypeString` method now supports nested classes (by @patrykpiotrmarek).
• Fixed – Dashboard Errors in Chrome and IE - Cannot read property 'removeChild' of null.
• Fixed – /hangfire/js outputs (unintended) UTF-8 BOM.
• Added – Deep integration with ASP.NET Core via Hangfire.AspNetCore package.
• Added – .NET Core support for Hangfire.Core and Hangfire.SqlServer packages (`netstandard1.3` target).
• Added – Zero latency processing when client and server reside in the same process (by @bgurmendi).
• Changed – `SqlServerStorage` class constructor now takes `DbConnection` instances (by @tystol).
• Changed – `SqlServerObjectsInstaller` class is public now (by @vbfox).
• Changed – Update Dapper to 1.50.1 version.
• Fixed – Drop constraints on Server.Id prior to altering it to avoid conflicts.
• Fixed – Package now depends on the latest Hangfire.SqlServer instead of version 1.2.2.
Showing the top 6 GitHub repositories that depend on HangFire:
osharp framework with .NETStandard2.0
This repo contains the code for allReady, an open-source solution focused on increasing awareness, efficiency and impact of preparedness campaigns as they are delivered by humanitarian and disaster response organizations in local communities.
A service for automated crash-dump analysis
Sample Asp.Net Core 3.1 projects which apply modern Clean Architecture, Domain-Driven Design, CQRS, Specification Pattern, Unit Testing, SOLID, Asp.Net Core Identity Custom Storage, Entity Framework Core, Identity Server 4, Blazor, Automated Testing With Selenium, Notification with SignalR, Tasks Scheduling with Hangfire, Health Checks, Security Headers, ...
Event Sourcing, CQRS and DDD framework for C#/.NET Core.
Read more about the GitHub Usage information on our documentation.