概览
Hangfire允许您以非常简单但可靠的方式启动请求处理管道之外的方法调用。这些方法调用在后台线程中执行,称为后台作业。
库由三个主要组件组成:客户端、存储和服务器。下面是一个小图表,描述了Hangfire的主要流程:
前提
Hangfire未绑定到特定的.NET应用程序类型。您可以在ASP.NET web应用程序、非ASP.NET web应用、控制台应用程序或Windows服务中使用它。以下是要求:
- .NET Framework 4.5
- Persistent storage (listed below)
- Newtonsoft.Json library ≥ 5.0.1
客户端
您可以使用Hangfire创建任何类型的后台作业:即发即弃(以卸载方法调用)、延迟(以在一段时间后执行调用)和重复(以每小时、每天执行方法,等等)。
Hangfire不要求您创建特殊类。后台作业基于常规静态或实例方法调用。
var client = new BackgroundJobClient();
client.Enqueue(() => Console.WriteLine("就是这么简单"));
client.Delay(() => Console.WriteLine("延迟执行"), TimeSpan.FromDays(1));
还有一种更简单的方法来创建后台作业——BackgroundJob类,它允许您使用静态方法来执行创建任务。
BackgroundJob.Enqueue(() => Console.WriteLine("Hello!"));
在Hangfire序列化给定信息并将其保存到存储器之后,控件将返回给调用者。
任务存储
Hangfire将后台作业和与处理相关的其他信息保存在持久存储中。持久性有助于后台作业在应用程序重新启动、服务器重新启动等情况下生存。这是使用CLR的线程池和Hangfire执行后台作业的主要区别。支持不同的存储后端:
- SQL Azure, SQL Server 2008 R2 (and later of any edition, including Express)
- Redis
SQL Server存储可以通过MSMQ或RabbitMQ来增强,以降低处理延迟。
GlobalConfiguration.Configuration.UseSqlServerStorage("db_connection");
服务器
后台作业由Hangfire服务器处理。它被实现为一组专用的(非线程池的)后台线程,用于从存储中获取作业并处理它们。服务器还负责保持存储清洁并自动删除旧数据。
您只需创建BackgroundJobServer类的实例并开始处理:
using (new BackgroundJobServer())
{
Console.WriteLine("Hangfire Server started. Press ENTER to exit...");
Console.ReadLine();
}
Hangfire为每个存储后端使用可靠的提取算法,因此您可以在web应用程序中启动处理,而不会在应用程序重新启动、进程终止等时丢失后台作业。