我正在使用.NET Core通用主机(不是Web主机)来构建需要相当长的正常关机时间的控制台应用程序。从中的源代码
aspnet/Hosting/src/Microsoft.Extensions.Hosting/HostOptions
很显然,ShutdownTimeout
选项可用于更改取消令牌中的关闭超时,该取消令牌作为参数提供给ShutdownAsync
。默认情况下为5秒。
但是,我无法弄清楚在通常放置在HostBuilder
文件中的Program.cs
配置代码中指定此选项的位置和方式。
有人可以张贴一些代码来显示如何执行此操作吗?
答案 0 :(得分:6)
好的,我终于弄清楚了...这是我的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.AddOptions<HostOptions>().Configure(
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块对于避免未处理的异常是必不可少的,即使我正在捕获通过等待StopAsync
中的取消令牌而生成的异常;因为似乎OperationCanceledException
的框架内部版本在关闭超时时也会生成未处理的StopAsync
。