Hangfire适用于大多数.NET平台:.NET Framework 4.5或更高版本、.NET Core 1.0或更高,或与.NET Standard 1.3兼容的任何平台。您可以将它与几乎任何应用程序框架集成,包括ASP.NET、ASP.NET Core、Console应用程序、Windows Services、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,以及稍后标识它的所有参数类型)和所有给定参数,并将其放置到Storage中。
Hangfire服务器通过查询存储来处理后台作业。大致来说,这是一组后台线程,它们侦听存储以获取新的后台作业,并通过对类型、方法和参数进行反序列化来执行这些作业。
您可以将此后台作业服务器放置在所需的任何进程中,包括像ASP.NET这样的危险进程——即使您终止了进程,在重新启动后也会自动重试后台作业。因此,在web应用程序的基本配置中,您不再需要使用Windows服务进行后台处理。
using (new BackgroundJobServer())
{
Console.ReadLine();
}
Hangfire作为两个NuGet包分发,从主要包Hangfire.Core开始,该包包含所有主要类和抽象。其他软件包如Hangfire.SqlServer提供了功能或抽象实现。要开始使用Hangfire,请安装主包并选择一个可用的存储。
Visual Studio 2017发布后,出现了一种全新的安装NuGet软件包的方式。因此,我放弃列出安装NuGet软件包的所有方法,转而使用几乎所有地方都可以使用的网络应用程序。
dotnet add package Hangfire.Core
dotnet add package Hangfire.SqlServer
使用GlobalConfiguration类执行配置。它的Configuration属性提供了许多扩展方法,包括Hangfire.Core以及其他包。如果您安装了新的软件包,请不要犹豫,检查是否有新的扩展方法。
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
})
.UseBatches()
.UsePerformanceCounters();
GlobalConfiguration.Configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseMemoryStorage();
方法调用可以被链接,因此不需要反复使用类名。全局配置是为了简化,几乎每个Hangfire类都允许您为存储、筛选器等指定重写。在ASP.NET Core环境中,全局配置类隐藏在AddHangfire方法中。
以下是所有正在运行的Hangfire组件,作为一个完整的示例,它从后台线程打印“Hello, world!”消息。您可以对与服务器相关的行进行注释,并多次运行程序——一旦再次取消注释这些行,所有后台作业都将立即处理。
using Hangfire;
using Hangfire.MemoryStorage;
using System;
namespace HangfireTest02
{
internal class Program
{
static void Main(string[] args)
{
GlobalConfiguration.Configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseMemoryStorage();
BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
using (var server = new BackgroundJobServer())
{
Console.ReadLine();
}
Console.ReadKey();
}
}
}