Hangfire 允许您以非常简单但可靠的方式来在请求处理管道之外启动方法调用。这些方法调用在后台线程中执行,称为后台任务。

概况来看,Hangfire 库由三个主要组件组成:客户端、存储和服务器。下面是一张小图,描述了 Hangfire 的主要过程: 文档 - 图1

要求

Hangfire不仅限于特定的.NET应用程序类型。您可以在ASP.NET Web应用程序、非ASP.NET Web应用程序、控制台应用程序或Windows服务中使用它。以下是要求:

  • .NET Framework 4.5.1或更高版本

  • 持久化存储(如下所示)

  • Newtonsoft.Json 库 ≥ 5.0.1

客户端

您可以使用 Hangfire 创建任何类型的后台任务:即发即忘(卸载方法调用)、延迟(在一段时间后执行调用)和重复(每小时、每天等执行方法)。

Hangfire 不需要您创建特殊的类。后台任务基于常规的静态或实例方法调用。

  1. var client = new BackgroundJobClient();
  2. client.Enqueue(() => Console.WriteLine("Easy!"));
  3. client.Delay(() => Console.WriteLine("Reliable!"), TimeSpan.FromDays(1));

还有更简单的创建后台作业的方法- BackgroundJob 类允许您使用静态方法执行创建任务。

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

控制返回给调用者,就在 Hangfire 序列化给定信息并将其保存到存储之后。

存储

Hangfire 将后台作业和其他与处理相关的信息保存在持久性存储中。持久性有助于后台作业在应用程序重启、服务器重新启动等情况下继续存在。这是使用 CLR 的线程池和 Hangfire 执行后台作业的主要区别。支持不同的存储后端:

  • SQL Azure、SQL Server 2008 R2(以及任何版本,包括Express)
  • Redis
  1. GlobalConfiguration.Configuration.UseSqlServerStorage("db_connection");

Server 端

后台任务由 Hangfire 服务器处理。它被实现为一组专用(不是线程池的)后台线程,从存储中获取任务并处理它们。服务器还负责保持存储的清洁并自动删除旧数据。

您需要做的只是创建一个 BackgroundJobServer 类的实例并开始处理:

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

Hangfire 为每个存储后端使用可靠的获取算法,因此您可以在Web应用程序内部启动处理,而不会丢失应用程序重新启动、进程终止等情况下的后台任务。