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

时间:2018-10-21 11:50:58

标签: c# .net-core

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

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

很显然,ShutdownTimeout选项可用于更改取消令牌中的关闭超时,该取消令牌作为参数提供给ShutdownAsync。默认情况下为5秒。

但是,我无法弄清楚在通常放置在HostBuilder文件中的Program.cs配置代码中指定此选项的位置和方式。

有人可以张贴一些代码来显示如何执行此操作吗?

1 个答案:

答案 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