Hangfire 激活器未处理

Hangfire activator not disposing

我在 Hangfire 无法处理它在 NET 5 上的 WebApi 中实例化的对象时遇到问题。

这是我在“ConfigureServices()”中的配置(非常标准,顺便说一句):

services.AddScoped<ITestService, TestService>(); // I have also tried with "AddTransient()"

services.AddHangfire(x => x.UseSqlServerStorage(Configuration.GetConnectionString("Default")));
services.AddHangfireServer();

然后,我有以下行在“Configure()”中配置重复作业:

public void Configure(IApplicationBuilder app,
                      IWebHostEnvironment env,
                      IHttpContextAccessor httpContextAccessor,
                      ITestService testService)
{
    // Omitting other configure code here

    RecurringJob.AddOrUpdate("Check", () => testService.Test(), Cron.Minutely); // You can try "*/1 * * * ? *" to speed it up
}

如您所见,正在通过 IoC 注入“ITestService”。

仅供参考,“ITestService”是“IDisposable”。如果我在构造函数和“Dispose()”方法中都放置了断点,则每个时间间隔都会调用构造函数,而永远不会调用“Dispose()”。

这对我来说是个问题,因为服务本身有其他依赖项,例如存储库(即:SQL 连接)。每当时间过去时,应用程序开始中断,因为它脱离了池中的连接:

fail: Hangfire.Processing.BackgroundExecution[0] Execution Worker is in the Failed state now due to an exception, execution will be retried no more than in 00:05:00 System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

如果我没记错的话,这个错误曾经与未处理 SQL 连接有关。

所以,你认为我做错了什么吗?或者它可能是一个错误?

编辑:

如果我把“this.Dispose()”放在TestService.Test()的末尾,并且我在那里手动配置了Repository,那么之前的错误就被修复了。但我认为这不是一个合适的解决方案 :S.

如评论中所述,您应该使用:

RecurringJob.AddOrUpdate<ITestService>("Check", t => t.Test(), Cron.Minutely);

以这种方式调用方法将触发 ITestServer 的依赖注入,实例将遵循预期的 life-cycle,需要调用 Dispose()