首页 > 解决方案 > ASP.NET Core 托管服务 ExecuteAsync() 方法未完成

问题描述

谁能帮我理解为什么“为什么永远不会被调用?” 在以下代码示例中关闭应用程序时永远不会登录到控制台?

public class TestBackgroundService : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        System.Console.WriteLine("Executing test background service...");

        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()方法的其余部分将在默认的五秒关闭超时期间执行,然后应用程序强制关闭。

控制台按预期显示“正在执行测试后台服务...”,但没有显示“为什么永远不会调用?”。

作为参考,可以在此处查看和阅读基本 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

标签: c#asp.net-core.net-coreasp.net-web-api

解决方案


我觉得里面有误会stoppingToken。这个令牌正在停止,Task.Delay(...)但是有一个System.Threading.Tasks.TaskCanceledException 所以你对日志的调用将永远无法到达。

// Simplified example
public static async Task Main()
{
    var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(2));
    // Throws after 2 seconds:
    await Task.Delay(4000, cancellationTokenSource.Token);
    // Never reached:
    Console.WriteLine("WHY DOES THIS NEVER GET CALLED?");
}

//Unhandled exception. System.Threading.Tasks.TaskCanceledException: A task was canceled.
//   at Program.Main()
//   at Program.<Main>()

完整的工作示例可以在这里找到

任务延迟文档


推荐阅读