我在 .Net 7 应用程序中使用 Hangfire 来运行 Fire and Forget 作业。 在文档中,它说只允许 Transient 或 Singleton 依赖项。然而,文档似乎已经“过时了”,因为它们需要使用“JobActivator
”,但现在不再需要了。我在作业中连接了作用域依赖项。这些 Scoped 依赖项甚至还有其他正在使用的 Scoped 依赖项。而且它有效。
hangfire 会在作业完成后处理该作用域对象吗?还是会泄漏到内存中?我需要手动处置作用域依赖项吗?
我在互联网上爬取了很多关于这个问题的信息,但似乎要么过时了,要么没有明确的答案。
让我担心这个问题的是这个
问题这是错误的实现,不应使用。有一个 作业激活器具有这些 BeginScope 函数的原因。唯一的办法 在这里使用这个实现就是将根服务传递给它 提供者。这意味着它永远不会被处理,意味着每次你 创建一个作业,您会泄漏创建的所有依赖项。
Hangfire.NetCore
并像这样注册您的hangfire:
services.AddHangfire(c => c
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseConsole()
,new SqlServerStorageOptions()));
那么是的,因为在幕后
Hangfire.NetCore
使用依赖于
AspNetCoreJobActivator
的IServiceScopeFactory
。 BeginScope
方法返回AspNetCoreJobActivatorScope
实例,该实例依赖于从“IServiceScopeFactory”创建范围的IServiceScope
。如果您查看 ,它会在
JobActivator
语句中使用 using
,因此所有内容都将在 using 语句的末尾进行处理。所以简而言之,每一项悬火工作都是一个范围。