要求

Hangfire 适用于大多数 .NET 平台:.NET Framework 4.5.1 或更高版本、.NET Core 1.0 或更高版本,或者与 .NET Standard 1.3 兼容的任何平台。您可以将其集成到几乎所有应用程序框架中,包括 ASP.NET、ASP.NET Core、控制台应用程序、Windows 服务、WCF 以及像 Nancy 或 ServiceStack 这样的社区驱动框架。

存储

存储是 Hangfire 保存与后台任务处理相关的所有信息的地方。所有细节,如类型、方法名称、参数等都被序列化并放入存储中,没有数据被保留在进程的内存中。 Hangfire 很好地抽象了存储子系统,可以针对 RDBMS 和 NoSQL 解决方案进行实现。

这是您必须做出的主要决策,也是在使用框架之前唯一需要的配置。以下示例显示了如何使用 SQL Server 数据库配置Hangfire。请注意,连接字符串可能因环境而异。

  1. GlobalConfiguration.Configuration
  2. .UseSqlServerStorage(@"Server=.\SQLEXPRESS; Database=Hangfire.Sample; Integrated Security=True");

客户端

客户端负责创建后台作业并将其保存到存储中。后台作业是在当前执行上下文之外执行的工作单位,例如在后台线程、其他进程或甚至不同的服务器上执行-所有这些都可以通过 Hangfire 实现,甚至无需额外的配置。

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

请注意,这不是委托,而是表达式树。Hangfire 不会立即调用方法,而是将类型(System.Console)、方法名称(WriteLine,以及所有参数类型以稍后进行识别)和所有给定的参数序列化并将其放入存储中。

服务端

Hangfire 服务器通过查询存储来处理后台作业。简单来说,它是一组后台线程,监听存储中的新后台作业,并通过反序列化类型、方法和参数来执行它们。

您可以将此后台作业服务器放置在您想要的任何进程中,包括像 ASP.NET 这样危险的进程-即使您终止了进程,您的后台作业也将在重新启动后自动重试。因此,在 Web 应用程序的基本配置中,您不再需要使用 Windows 服务进行后台处理。

  1. using (new BackgroundJobServer())
  2. {
  3. Console.ReadLine();
  4. }

安装

Hangfire 以几个 NuGet 包的形式分发,从主包 Hangfire.Core 开始,它包含所有主要的类和抽象。其他包如Hangfire.SqlServer 提供功能或抽象实现。要开始使用 Hangfire,请安装主包并选择一个可用的存储。

在 Visual Studio 2017 发布之后,出现了一种全新的安装 NuGet 包的方式。因此,我放弃了列出所有安装 NuGet 包的方式,转而使用几乎到处都可用的 dotnet app。

  1. dotnet add package Hangfire.Core
  2. dotnet add package Hangfire.SqlServer
  3. dotnet add package Microsoft.Data.SqlClient

配置

配置使用 GlobalConfiguration 类进行。它的 Configuration 属性提供了许多扩展方法,既有来自 Hangfire.Core的,也有其他包的。如果您安装了新包,请立刻地检查是否有新的扩展方法。

Hangfire 1.8

  1. GlobalConfiguration.Configuration
  2. .SetDataCompatibilityLevel(CompatibilityLevel.Version_180)
  3. .UseSimpleAssemblyNameTypeSerializer()
  4. .UseRecommendedSerializerSettings()
  5. .UseSqlServerStorage("Database=Hangfire.Sample; Integrated Security=True;");

Hangfire 1.7

  1. GlobalConfiguration.Configuration
  2. .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
  3. .UseSimpleAssemblyNameTypeSerializer()
  4. .UseRecommendedSerializerSettings()
  5. .UseSqlServerStorage("Database=Hangfire.Sample; Integrated Security=True;", new SqlServerStorageOptions
  6. {
  7. CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
  8. SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
  9. QueuePollInterval = TimeSpan.Zero,
  10. UseRecommendedIsolationLevel = true
  11. });

方法调用可以链接在一起,因此无需一遍又一遍地使用类名。全局配置是为了简化操作,几乎每个 Hangfire 类都允许您指定存储、过滤器等的覆盖。在 ASP.NET Core 环境中,全局配置类隐藏在 AddHangfire 方法中。

使用

以下是所有 Hangfire 组件的示例,它从后台线程打印 “Hello, world!” 消息。您可以注释与服务器相关的行,并多次运行程序-只要您再次取消注释这些行,所有后台作业都将被处理。

  1. using System;
  2. using Hangfire;
  3. using Hangfire.SqlServer;
  4. namespace ConsoleApplication2
  5. {
  6. class Program
  7. {
  8. static void Main()
  9. {
  10. GlobalConfiguration.Configuration
  11. .SetDataCompatibilityLevel(CompatibilityLevel.Version_180)
  12. .UseColouredConsoleLogProvider()
  13. .UseSimpleAssemblyNameTypeSerializer()
  14. .UseRecommendedSerializerSettings()
  15. .UseSqlServerStorage("Database=Hangfire.Sample; Integrated Security=True;");
  16. BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
  17. using (var server = new BackgroundJobServer())
  18. {
  19. Console.ReadLine();
  20. }
  21. }
  22. }
  23. }