[英]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
}
如您所見,“ITestService”正在通過 IoC 注入。
僅供參考,“ITestService”是“IDisposable”。 如果我在構造函數和“Dispose()”方法中都設置斷點,則構造函數會在每個間隔被調用,而“Dispose()”則永遠不會被調用。
這對我來說是個問題,因為服務本身還有其他依賴項,例如存儲庫(即:SQL 連接)。 每當時間過去,應用程序就會開始中斷,因為它失去了池中的連接:
失敗:Hangfire.Processing.BackgroundExecution[0] Execution Worker 由於異常,現在處於 Failed state 中,將在 00:05:00 內重試執行 System.InvalidOperationException: Timeout expired。 在從池中獲取連接之前超時時間已過。 這可能是因為所有池連接都在使用中並且達到了最大池大小。
如果我沒記錯的話,此錯誤與未處理 SQL 連接有關。
那么,你認為我做錯了什么嗎? 或者它可能是一個錯誤?
編輯:
如果我將“this.Dispose()”放在 TestService.Test() 的末尾,並在那里手動處理存儲庫,那么之前的錯誤就修復了。 但我認為這不是一個合適的解決方案:S。
如評論中所述,您應該使用:
RecurringJob.AddOrUpdate<ITestService>("Check", t => t.Test(), Cron.Minutely);
以這種方式調用該方法將觸發ITestServer
的依賴注入,並且實例將遵循預期的生命周期,並需要調用Dispose()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.