平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“采用 Hangfire 在 .NET 9 中实现方法可靠定时任务的最佳实……”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
从实现思路看,随着 .NET 9 发布,后台任务调度和定时任务管理变得更轻松、更高效。本文将展示如何在 .NET 9 中采用 Hangfire 构建定时任务系统,并讲解从开发到生产的最佳实践。
Hangfire 是一个成熟的 .NET 后台任务框架,兼容:
Hangfire 的核心优势:
新建 .NET 9 Web API 项目:
dotnet new web -n HangfireNet9Demo
cd HangfireNet9Demo
安装 Hangfire 和内存存储(测试用):
dotnet add package Hangfire
dotnet add package Hangfire.MemoryStorage
如果是生产环境建议采用 SQL Server:
dotnet add package Hangfire.SqlServer
在 Program.cs 中进行设置。NET 9 兼容 最小 API 风格:
using Hangfire;
using Hangfire.MemoryStorage;
using Hangfire.Common;
var builder = WebApplication.CreateBuilder(args);
// 配置 Hangfire 服务
builder.Services.AddHangfire(config =>
{
// 测试环境使用内存存储
config.UseMemoryStorage();
// 生产环境推荐:
// config.UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireDb"));
});
builder.Services.AddHangfireServer();
var app = builder.Build();
// 启用 Hangfire Dashboard,默认路径 /hangfire
app.UseHangfireDashboard();
// 根路由测试
app.MapGet("/", () => "Hangfire with .NET 9 is running...");
app.Lifetime.ApplicationStarted.Register(() =>
{
BackgroundJob.Enqueue(() => Console.WriteLine("立即执行的任务"));
});
app.Lifetime.ApplicationStarted.Register(() =>
{
BackgroundJob.Schedule(() => Console.WriteLine("延迟 1 分钟执行"), TimeSpan.FromMinutes(1));
});
周期任务通常用来定时报告、邮件或数据清理:
app.Lifetime.ApplicationStarted.Register(() =>
{
var recurringJobManager = app.Services.GetRequiredService<IRecurringJobManager>();
recurringJobManager.AddOrUpdate(
"say-hello-job",
Job.FromExpression(() => Console.WriteLine("Hello Hangfire .NET 9!")),
"*/1 * * * *", // 每分钟执行
new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }
);
});
注意:
Job.FromExpression 让 Hangfire 能够序列化方法调用。RecurringJobOptions 可设置时区、队列等。Hangfire 自带 Dashboard,能够监控:
访问:
http://localhost:5000/hangfire
在生产环境中,能够设置 身份验证:
app.UseHangfireDashboard("/hangfire", new DashboardOptions
{
Authorization = new[] { new MyAuthorizationFilter() }
});
[AutomaticRetry(Attempts = 5)] 调整。using Hangfire;
using Hangfire.MemoryStorage;
using Hangfire.Common;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHangfire(config => config.UseMemoryStorage());
builder.Services.AddHangfireServer();
var app = builder.Build();
app.UseHangfireDashboard();
app.MapGet("/", () => "Hangfire with .NET 9 is running...");
// Fire-and-Forget
app.Lifetime.ApplicationStarted.Register(() =>
{
BackgroundJob.Enqueue(() => Console.WriteLine("立即执行的任务"));
BackgroundJob.Schedule(() => Console.WriteLine("延迟 1 分钟执行"), TimeSpan.FromMinutes(1));
var recurringJobManager = app.Services.GetRequiredService<IRecurringJobManager>();
recurringJobManager.AddOrUpdate(
"say-hello-job",
Job.FromExpression(() => Console.WriteLine("Hello Hangfire .NET 9!")),
"*/1 * * * *",
new RecurringJobOptions { TimeZone = TimeZoneInfo.Local }
);
});
app.Run();
总结
到此这篇关于采用 Hangfire 在 .NET 9 中实现可靠定时任务的最佳实践的文章就介绍到这了,更多相关.net hangfire定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!