.NET Core 6实现项目启动时自动触发Cron定时任务
解决方案
要让Hangfire定时任务在.NET Core 6项目启动时自动注册,无需手动调用API接口,可按以下步骤调整:
1. 重构任务逻辑到独立服务类
把原来控制器中的jobmethod提取到独立服务类中,更符合依赖注入原则,便于在启动流程中调用:
public class MyRecurringJobService { // 可通过构造函数注入所需服务(如数据库上下文、日志等) public async Task JobMethod() { // 这里放置原jobmethod中的业务逻辑 } }
2. 注册服务到依赖注入容器
在Program.cs中注册上述服务:
builder.Services.AddScoped<MyRecurringJobService>();
3. 启动时自动注册定时任务
提供两种实现方式,选其一即可:
方式一:使用后台托管服务(IHostedService)
创建一个托管服务,在项目启动时执行任务注册:
public class JobRegistrationHostedService : IHostedService { private readonly IServiceProvider _serviceProvider; public JobRegistrationHostedService(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public Task StartAsync(CancellationToken cancellationToken) { using var scope = _serviceProvider.CreateScope(); var jobService = scope.ServiceProvider.GetRequiredService<MyRecurringJobService>(); // 每5天执行一次任务,若任务已存在则更新配置 RecurringJob.AddOrUpdate(() => jobService.JobMethod(), Cron.DayInterval(5)); return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } }
然后在Program.cs中注册该托管服务:
builder.Services.AddHostedService<JobRegistrationHostedService>();
方式二:直接在Program.cs启动流程中执行
在Program.cs的主机构建完成后,直接添加任务注册逻辑:
var app = builder.Build(); // 保留原有中间件配置(如UseRouting、UseAuthorization等) // 注册定时任务 using (var scope = app.Services.CreateScope()) { var jobService = scope.ServiceProvider.GetRequiredService<MyRecurringJobService>(); RecurringJob.AddOrUpdate(() => jobService.JobMethod(), Cron.DayInterval(5)); } app.Run();
4. 清理冗余代码
删除原控制器中的RunMyJob接口方法,因为不再需要手动调用。
注意事项
- 确保项目已正确配置Hangfire:包括添加Hangfire服务(
AddHangfire、AddHangfireServer)和中间件(UseHangfireDashboard),开发环境可使用内存存储,生产环境建议配置数据库存储(如SQL Server、PostgreSQL等)。 - 异步任务可直接被Hangfire处理,无需额外包装。
内容的提问来源于stack exchange,提问作者omar seleim
相关产品推荐
相关产品推荐

