gpt4 book ai didi

c# - 配置 .NET Core 通用主机时如何应用 HostOptions.ShutdownTimeout?

转载 作者:行者123 更新时间:2023-11-30 14:05:51 28 4
gpt4 key购买 nike

我正在使用 .NET Core 通用主机(不是 Web 主机)来构建一个需要相当长时间的正常关闭的控制台应用程序。从源代码中

aspnet/Hosting/src/Microsoft.Extensions.Hosting/HostOptions

很明显,ShutdownTimeout 选项可用于更改作为参数提供给 ShutdownAsync 的取消 token 中的关闭超时。默认为 5 秒。

但是,我不知道在哪里以及如何编写代码来在通常放在 Program.cs 中的 HostBuilder 配置代码中指定此选项文件。

有人可以发布一些代码来说明如何执行此操作吗?

最佳答案

好吧,我终于想通了......这是 Program.cs Main 函数中配置代码的概要,其中省略了大部分项目,以显示 HostOptins.ShutdownTimeout 的配置位置。

public static async Task Main(string[] args)
{
var host = new HostBuilder()
.ConfigureHostConfiguration(configHost => {...})
.ConfigureAppConfiguration((hostContext, configApp) => {...})
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<ApplicationLifetime>();
...
services.Configure<HostOptions>(
opts => opts.ShutdownTimeout = TimeSpan.FromSeconds(10));
})
.ConfigureLogging(...)
.UseConsoleLifetime()
.Build();

try
{
await host.RunAsync();
}
catch(OperationCanceledException)
{
; // suppress
}
}

为了使其正常工作,这是我的 IHostedService 类中的 StopAsync 方法:

public async Task StopAsync(CancellationToken cancellationToken)
{
try
{
await Task.Delay(Timeout.Infinite, cancellationToken);
}
catch(TaskCanceledException)
{
_logger.LogDebug("TaskCanceledException in StopAsync");
// do not rethrow
}
}

参见 Graceful shutdown with Generic Host in .NET Core 2.1有关此的更多详细信息。

顺便说一句,Program.Main 中的 catch block 对于避免未处理的异常是必要的,即使我正在捕获通过等待 StopAsync 中的取消 token 生成的异常;因为似乎未处理的 OperationCanceledException 也在关闭超时到期时由 StopAsync 的框架内部版本生成。

关于c# - 配置 .NET Core 通用主机时如何应用 HostOptions.ShutdownTimeout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52915015/

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