Hangfire 是一个开源库,允许在 .NET 应用程序中简化任务调度和后台处理。它支持将任务添加到队列中并在后台异步执行,具有重试机制、延时任务、定时任务和持久化等功能。
- 后台处理:将任务放在后台队列中异步执行,而不阻塞主线程。
- 任务调度:支持定时任务和延时任务。
- 重试机制:自动重试失败的任务。
- 持久化存储:任务和它们的状态存储在数据库中(例如 SQL Server、MySQL 等),确保任务不会因为应用程序重启或崩溃而丢失。
- 仪表盘:提供一个 Web 界面来查看和管理任务。
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 添加 Hangfire 服务,使用内存存储(仅用于开发环境,生产环境请使用持久化存储如 SQL Server)
services.AddHangfire(config => config.UseMemoryStorage());
// 添加 Hangfire 服务器
services.AddHangfireServer();
// 其他服务注册
}
public void Configure(IApplicationBuilder app, IBackgroundJobClient backgroundJobs, IRecurringJobManager recurringJobs)
{
// 使用 Hangfire 仪表盘
app.UseHangfireDashboard();
// 配置定时任务
recurringJobs.AddOrUpdate(
"my-recurring-job",
() => Console.WriteLine("Recurring job executed!"),
Cron.Daily);
}
}
- Enqueue
- 入队,用于创建一个立即执行的后台任务。
IBackgroundJobClient.Enqueue(() => Console.WriteLine("Hello, Hangfire!"));
- Schedule
- 用于创建一个延时执行的后台任务。
IBackgroundJobClient.Schedule(() => Console.WriteLine("This task will be executed after a delay"), TimeSpan.FromMinutes(5));
- AddOrUpdate
- 用于创建或更新一个定时任务。
IRecurringJobManager.AddOrUpdate(
"my-recurring-job",
() => Console.WriteLine("Recurring job executed!"),
Cron.Daily);
- ContinueWith
- 用于创建一个后续任务,该任务在前一个任务成功完成后执行。
var jobId = IBackgroundJobClient.Enqueue(() => Console.WriteLine("Initial job"));
IBackgroundJobClient.ContinueWith(jobId, () => Console.WriteLine("Continuation job"));
- Delete
- 用于删除一个已排队但尚未执行的后台任务。
IBackgroundJobClient.Delete(jobId);
- Requeue
- 用于重新排队一个已失败的任务。
IBackgroundJobClient.Requeue(jobId);
- Trigger
- 用于立即触发一个定时任务,而不等待其下一次计划执行时间。
IRecurringJobManager.Trigger("my-recurring-job");
- RemoveIfExists
- 用于删除一个定时任务。
IRecurringJobManager.RemoveIfExists("my-recurring-job");
- Hangfire 使用 Cron 表达式来定义定时任务的执行时间。以下是一些常见的 Cron 表达式:
- Cron.Minutely - 每分钟执行一次
- Cron.Hourly - 每小时执行一次
- Cron.Daily - 每天执行一次
- Cron.Weekly - 每周执行一次
- Cron.Monthly - 每月执行一次
- Cron.Yearly - 每年执行一次
你也可以使用自定义的 Cron 表达式。例如,每天早上 6 点执行:
IRecurringJobManager.AddOrUpdate(
"daily-6am-job",
() => Console.WriteLine("This job runs every day at 6 AM"),
"0 6 * * *");
ps:
https://www.hangfire.io/overview.html hangfire官网
https://bradymholt.github.io/cron-expression-descriptor/?locale=zh-CN&expression=0+*%2F2+*+*+* 查询Corn翻译
https://en.wikipedia.org/wiki/Cron#Non-standard_characters Cron的百科网页