我正在尝试使用.NET Core开发一个简单的API,允许异步处理请求。
- 请求发送到控制器
- 在后台服务(IHostedService)上预定工作
- 控制器返回202
- 后台服务执行长时间运行操作
由于应用程序将在IIS上运行,在控制器返回响应后,可能会发生池回收。我想实现一种方式,使应用程序能够进行平稳关闭 - 完成当前正在执行的任务,但不接受任何新任务。
我正在努力让平稳关闭顺利结束。出于测试目的,我简化了StopAsync()
方法,现在它只包含一个20秒的异步等待:
public async Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Hosted service is stopping...");
try
{
// Signal cancellation to the executing method
_stoppingTokenSource.Cancel();
_logger.LogInformation("Delay by 20s");
await Task.Delay(20000, cancellationToken);
_logger.LogInformation("Delay over");
}
finally
{
// Await all pending download requests
await Task.WhenAny(Task.WhenAll(_pendingTasks), Task.Delay(Timeout.Infinite, cancellationToken));
_logger.LogInformation("Hosted service has been stopped successfully.");
}
}
日志仅显示以下内容:
- 托管服务正在停止...
- 延迟20秒
- 发送关机HTTP消息到进程'11104'并接收http状态'202'。
- 无法优雅地关闭进程'11104'。
在Program.cs
上设置关机超时。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseShutdownTimeout(TimeSpan.FromMinutes(1));
检查应用程序池的高级设置:
如果您已经做过类似的事情,请告诉我是否有做错什么/指导我正确的方向?
谢谢!
编辑
在调试应用程序时,使用CTRL + C关闭会产生预期的行为。