c# - 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
解决方案
我觉得里面有误会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>()
推荐阅读
- c# - 匹配字符串而不匹配特定单词
- python - Python BeautifulSoup 看不到下拉列表选项值
- php - 为什么第一个代码可以在服务器上运行,而第二个代码不行
- python - 为人脸识别问题创建数据库
- reactjs - 时刻返回错误的日期时间
- reactjs - 如何使用反应有条件地删除值属性
- google-apps-script - 使用 Over-grid Button 在脚本中引用按钮的锚单元格
- c# - 使用 XamDataGrid DataItemUpdateTrigger 更新属性
- lombok - eclipse路径中的特殊字符导致安装lombok后eclipse不再启动?
- r - R:用最常见的变体替换字符串