在控制台应用中使用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
相关产品推荐
相关产品推荐

