【发布时间】:2018-08-01 13:31:05
【问题描述】:
我正在尝试在 .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 秒
查看 EventViewer 我可以看到 2 个为关闭而引发的事件,它们之间正好相隔 10 秒:
- 向进程“11104”发送关闭 HTTP 消息并收到 http 状态“202”。
- 未能正常关闭进程“11104”。
我已经试过了:
在Program.cs上设置关机超时
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseShutdownTimeout(TimeSpan.FromMinutes(1));
检查应用程序池的高级设置:
如果你做过类似的事情,如果我做错了什么,请告诉我/指出正确的方向吗?
谢谢!
编辑
在调试应用程序时,使用 CTRL + C 关闭会产生预期的行为。
【问题讨论】:
-
你找到这个问题的答案了吗?
-
@pcdev,我找到了一个解决方案,尽管它需要更改 Web 配置文件。我已将其发布为答案。
标签: c# iis asp.net-core iis-7.5