要求
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。请注意,连接字符串可能因环境而异。
GlobalConfiguration.Configuration.UseSqlServerStorage(@"Server=.\SQLEXPRESS; Database=Hangfire.Sample; Integrated Security=True");
客户端
客户端负责创建后台作业并将其保存到存储中。后台作业是在当前执行上下文之外执行的工作单位,例如在后台线程、其他进程或甚至不同的服务器上执行-所有这些都可以通过 Hangfire 实现,甚至无需额外的配置。
BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
请注意,这不是委托,而是表达式树。Hangfire 不会立即调用方法,而是将类型(System.Console)、方法名称(WriteLine,以及所有参数类型以稍后进行识别)和所有给定的参数序列化并将其放入存储中。
服务端
Hangfire 服务器通过查询存储来处理后台作业。简单来说,它是一组后台线程,监听存储中的新后台作业,并通过反序列化类型、方法和参数来执行它们。
您可以将此后台作业服务器放置在您想要的任何进程中,包括像 ASP.NET 这样危险的进程-即使您终止了进程,您的后台作业也将在重新启动后自动重试。因此,在 Web 应用程序的基本配置中,您不再需要使用 Windows 服务进行后台处理。
using (new BackgroundJobServer()){Console.ReadLine();}
安装
Hangfire 以几个 NuGet 包的形式分发,从主包 Hangfire.Core 开始,它包含所有主要的类和抽象。其他包如Hangfire.SqlServer 提供功能或抽象实现。要开始使用 Hangfire,请安装主包并选择一个可用的存储。
在 Visual Studio 2017 发布之后,出现了一种全新的安装 NuGet 包的方式。因此,我放弃了列出所有安装 NuGet 包的方式,转而使用几乎到处都可用的 dotnet app。
dotnet add package Hangfire.Coredotnet add package Hangfire.SqlServerdotnet add package Microsoft.Data.SqlClient
配置
配置使用 GlobalConfiguration 类进行。它的 Configuration 属性提供了许多扩展方法,既有来自 Hangfire.Core的,也有其他包的。如果您安装了新包,请立刻地检查是否有新的扩展方法。
Hangfire 1.8
GlobalConfiguration.Configuration.SetDataCompatibilityLevel(CompatibilityLevel.Version_180).UseSimpleAssemblyNameTypeSerializer().UseRecommendedSerializerSettings().UseSqlServerStorage("Database=Hangfire.Sample; Integrated Security=True;");
Hangfire 1.7
GlobalConfiguration.Configuration.SetDataCompatibilityLevel(CompatibilityLevel.Version_170).UseSimpleAssemblyNameTypeSerializer().UseRecommendedSerializerSettings().UseSqlServerStorage("Database=Hangfire.Sample; Integrated Security=True;", new SqlServerStorageOptions{CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),QueuePollInterval = TimeSpan.Zero,UseRecommendedIsolationLevel = true});
方法调用可以链接在一起,因此无需一遍又一遍地使用类名。全局配置是为了简化操作,几乎每个 Hangfire 类都允许您指定存储、过滤器等的覆盖。在 ASP.NET Core 环境中,全局配置类隐藏在 AddHangfire 方法中。
使用
以下是所有 Hangfire 组件的示例,它从后台线程打印 “Hello, world!” 消息。您可以注释与服务器相关的行,并多次运行程序-只要您再次取消注释这些行,所有后台作业都将被处理。
using System;using Hangfire;using Hangfire.SqlServer;namespace ConsoleApplication2{class Program{static void Main(){GlobalConfiguration.Configuration.SetDataCompatibilityLevel(CompatibilityLevel.Version_180).UseColouredConsoleLogProvider().UseSimpleAssemblyNameTypeSerializer().UseRecommendedSerializerSettings().UseSqlServerStorage("Database=Hangfire.Sample; Integrated Security=True;");BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));using (var server = new BackgroundJobServer()){Console.ReadLine();}}}}
