You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在控制台应用中使用Hangfire时,如何通过非过时方法为SqlStorage添加额外后台进程?

在控制台应用中使用Hangfire时,如何通过非过时方法为SqlStorage添加额外后台进程?

嘿,我来帮你搞定这个问题!你碰到的两个核心痛点:一是JobStorage.Current在ConfigureServices阶段还没完成初始化,直接调用会报错;二是旧的GetComponents方法已经被标记为过时。下面给你两种非过时的正确解决方案:

方法一:通过AddHangfireServer重载直接传入自定义进程

其实AddHangfireServer有个很实用的重载——不需要手动传递JobStorage参数,它会自动从依赖注入容器中获取你之前通过AddHangfire配置好的JobStorage实例,完美避开JobStorage.Current未初始化的问题。

只需要把你原来的代码改一改:

原来的错误写法:

_ = services.AddHangfireServer(JobStorage.Current, new[] { new MyProcess { } });

改成这个样子:

// 不需要手动传JobStorage,DI容器会自动注入
_ = services.AddHangfireServer(additionalProcesses: new[] { new MyProcess() });

方法二:在配置SqlServerStorage时添加后台进程

如果你的自定义进程是和Sql存储紧密相关的(比如需要操作Hangfire的Sql存储表),可以直接在配置SqlServerStorage的时候,把它加入到Sql存储的后台进程集合里。这种方式不需要在AddHangfireServer里额外传参,Hangfire会自动加载这些进程。

代码示例如下:

_ = services.AddHangfire(gc => {
    _ = gc
        .UseSimpleAssemblyNameTypeSerializer()
        .UseRecommendedSerializerSettings()
        .UseSqlServerStorage(dbcs, options => {
            // 把自定义进程添加到SqlStorage的后台进程列表中
            options.AddBackgroundProcess<MyProcess>();
        });
});

// 这里不需要额外传入进程,AddHangfireServer会自动加载所有注册的后台进程
_ = services.AddHangfireServer();

补充:自定义进程的基本实现

不管用哪种方法,你的MyProcess都需要实现Hangfire的IBackgroundProcess接口,这里给你一个简单的示例模板:

public class MyProcess : IBackgroundProcess
{
    public void Execute(BackgroundProcessContext context)
    {
        // 这里写你的后台逻辑,比如定时检查数据、清理过期内容等
        Console.WriteLine("我的自定义后台进程正在运行...");
        
        // 记得处理生命周期,比如每隔5分钟执行一次,同时响应Hangfire的取消信号
        context.CancellationToken.WaitHandle.WaitOne(TimeSpan.FromMinutes(5));
    }
}

这两种方法都是Hangfire官方推荐的非过时方案,既解决了初始化报错的问题,又符合最新的API规范。

备注:内容来源于stack exchange,提问作者Thad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 13:08:06