誰能幫助我理解為什么在以下代碼示例中,當應用程式關閉時,"WHY DOES THIS NEVER GET CALLED? "從未被記錄到控制臺?
public class TestBackgroundService : BackgroundService
{
protected override async 任務 ExecuteAsync(CancellationToken stoppingToken)
{
System.Console.WriteLine("執行測驗后臺服務...")。
await Task.Delay(Timeout.Infinite, stoppingToken)。
System.Console.WriteLine("WHY DOES THIS NEVER GET CALLED?")。
}
}
這在Startup類中被注冊為托管服務,像往常一樣:
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<TestBackgroundService>()。
}
我的期望是,當應用程式開始關閉時,stoppingToken被觸發,對Task.Delay()的呼叫應該回傳,然后ExecuteAsync()方法的其余部分將在默認的5秒關機超時期間執行,然后應用程式強制關閉。
控制臺顯示 "正在執行測驗背景服務......",正如預期的那樣,但沒有顯示 "為什么這個服務從未被呼叫?"
。作為參考,可以在這里看到和閱讀基礎的BackgroundService類,并有一個例子。https://docs.microsoft.com/en-us/dotnet/architecture/microservices/multi-container-microservice-net-applications/background-tasks-with-ihostedservice#implementing-ihostedservice-with-a-custom-hosted-service-class-deriving-from-the-backgroundservice-base-class
uj5u.com熱心網友回復:
我認為在stoppingToken中存在一個誤解。這個令牌是停止了Task.Delay(...),但是出現了System.Threading.Tasks.TaskCanceledException。
所以你對日志的呼叫將永遠不會達到。
//簡化例子
public static async Task Main()
{
var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(2) )。)
///2秒后拋出:。
await Task.Delay(4000, cancellationTokenSource.Token)。
//從未達到:
Console.WriteLine("WHY DOES THIS NEVER GET CALLED?")。
}
//未處理的例外。System.Threading.Tasks.TaskCanceledException。一個任務被取消了。
//at Program.Main()
// at Program.<Main>()
。
uj5u.com熱心網友回復:
根據MS檔案中關于'在ASP.NET Core中使用托管服務的后臺任務'
。是'StopAsync'方法在應用程式開始關閉時被呼叫,為了使您能夠在應用程式關閉時執行某些操作,您需要在后臺服務類中實作 StopAsync 的重寫。
因此你需要在同一個類中的 ExecuteAsync() 下添加一個方法,其內容如下:
public Task StopAsync(CancellationToken stoppingToken)
{
System.Console.WriteLine("WHY DOES THIS NEVER GET CALLED?")。
await base.StopAsync(stoppingToken)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/328664.html
標籤:
