gpt4 book ai didi

c# - IHostedService 的优雅关闭

转载 作者:行者123 更新时间:2023-11-30 14:45:53 27 4
gpt4 key购买 nike

我正在尝试在 .NET Core 中开发一个允许异步处理请求的简单 API。

  1. 请求发送给 Controller
  2. 安排在后台服务 (IHostedService) 上的工作
  3. Controller 返回 202
  4. 后台服务执行长时间运行的操作

由于应用程序将在 IIS 上运行,因此在 Controller 返回响应后可能会发生池回收。我想实现一种允许应用程序正常关闭的方法 - 完成它当前正在执行的任务,但不接受任何新任务。

我在正常关机运行结束时遇到困难。出于测试目的,我简化了 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));

检查应用程序池的高级设置:

enter image description here

如果你做过类似的事情,如果我做错了什么/指出正确的方向,你能告诉我吗?

谢谢!

编辑

在调试应用程序时,使用 CTRL + C 关闭会产生预期的行为。

最佳答案

重新审视问题后,我找到了解决方案。

IIS 中的 ASP.NET Core 模块似乎有一个单独的关闭时间限制,可以在 web.config 文件中配置为:

    <configuration>
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>
<aspNetCore
shutdownTimeLimit="30" - set timeout here in seconds
processPath="dotnet"
arguments=".\GracefulShutdown.dll"
stdoutLogEnabled="false"
stdoutLogFile=".\logs\stdout" />
</system.webServer>
</configuration>

设置引用: https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-2.1

理想情况下,这应该可以通过代码获得,这仍然是我正在努力解决的问题。如果您找到了解决方法,请在评论中分享。

关于c# - IHostedService 的优雅关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51634638/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com