1. 什么是 Hangfire
- Hangfire 是一个用于 .NET 应用程序的开源库,支持轻松的后台任务处理,无需编写复杂的调度逻辑。
- Hangfire 的关键特性包括:后台任务处理、自动重试、持久化存储、任务队列和实时监控等。
- 适用场景:长时间运行的任务、定时任务、异步任务处理等。
2. 安装 Hangfire
-
前提条件: 需要一个 ASP.NET Core 项目。
-
通过 NuGet 安装 Hangfire:
Install-Package Hangfire
-
同时安装 Hangfire 支持的数据库驱动(如 SQL Server 或 Redis)。
3. Hangfire 配置
-
在 Startup.cs 文件中配置 Hangfire:
public void ConfigureServices(IServiceCollection services) { // 添加 Hangfire 服务,并配置使用 SQL Server 作为持久化存储 services.AddHangfire(x => x.UseSqlServerStorage("your_connection_string")); // 添加 Hangfire 服务器,后台处理任务的核心服务 services.AddHangfireServer(); } public void Configure(IApplicationBuilder app, IBackgroundJobClient backgroundJobs) { // 使用 Hangfire Dashboard,允许在浏览器中查看任务的执行情况 app.UseHangfireDashboard(); // 创建一个 Fire-and-forget 类型的后台任务,即立即执行一次 backgroundJobs.Enqueue(() => Console.WriteLine("Hello Hangfire!")); }
-
配置 Hangfire 使用的持久化存储(如 SQL Server、Redis)。
-
启用 Hangfire Dashboard 以实时监控任务。
4. Hangfire 的任务类型
-
立即执行的任务(Fire-and-forget):
// 示例:立即执行的任务 BackgroundJob.Enqueue(() => SendEmail("user@example.com", "Welcome to Hangfire!"));
-
延迟任务(Delayed jobs):
// 示例:延迟任务,10 分钟后执行 BackgroundJob.Schedule(() => Console.WriteLine("延迟任务"), TimeSpan.FromMinutes(10));
-
周期性任务(Recurring jobs):
// 示例:周期性任务,每天执行一次 RecurringJob.AddOrUpdate(() => Console.WriteLine("周期性任务"), Cron.Daily);
-
连续任务(Continuation jobs):
// 示例:连续任务,前一个任务执行完成后自动执行 BackgroundJob.ContinueWith(previousJobId, () => Console.WriteLine("连续任务"));
5. Hangfire Dashboard
- 通过 /hangfire 路由访问 Hangfire Dashboard,实时查看任务的执行状态。
- 可以使用身份验证功能对 Dashboard 进行安全保护。
6. 错误处理与自动重试
-
Hangfire 具有自动重试机制,失败的任务会在一定次数内重试。
-
通过日志记录失败任务的详细信息,便于调试和修复。
GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 5 });
7. 高级主题
-
使用队列(Queues) 进行优先级任务处理:
-
可以将任务分配到不同的队列,根据优先级或资源分配处理任务。
BackgroundJob.Enqueue(() => Console.WriteLine("高优先级任务"), "critical");
-
自定义过滤器(Job Filters) 用于增强任务处理逻辑,比如任务性能监控、异常处理等。
8. 实际应用示例
-
一个常见的应用场景是后台处理电子邮件发送任务:
BackgroundJob.Enqueue(() => SendEmail("user@example.com", "Welcome to Hangfire!"));
9. 最佳实践
- 优化任务处理,避免资源占用过多。
- 在分布式系统中使用 Hangfire 时,确保任务的持久化与协调性。