如何在进程停止时取消Web主机



我刚刚尝试在模板化web API(dotnet 5(中使用async Task Main方法。这是我的锅炉铭牌代码:

public class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());
}

我注意到RunAsync采用了一个取消令牌,我希望这是基于应用程序关闭。

我的问题-在此处设置链接回进程关闭的取消令牌的正确(标准(方法是什么?

我可以这样做:

public static async Task Main(string[] args)
{
var cts = new CancellationTokenSource();
AppDomain.CurrentDomain.UnhandledException += (s, e) => { if (e.IsTerminating) cts.Cancel(); };
AppDomain.CurrentDomain.ProcessExit += (s, e) => cts.Cancel();
Console.CancelKeyPress += (s, e) => { e.Cancel = true; cts.Cancel(); };
await CreateHostBuilder(args).Build().RunAsync(cts.Token);
}

但我想知道我是否缺少一种更标准的方法。

感谢您提前提供任何提示!

.NET主机设计将基于外部事件终止应用程序的逻辑(例如控制台应用程序中的CTRL+C(放入IHostLifetime接口的实现中。

IHostLifetime的现有实现包括控制台、windows服务和systemd。这基本上是UseWindowsServiceUseSystemd扩展注册的内容,请参阅例如WindowServiceLifetimeHostBuilderExtensions源代码。Lifetime实现通常使用IHostApplicationLifetime来关闭应用程序。默认的web主机设置包括控制台生存期。

使用这种方法,可以将单个应用程序配置为控制台应用程序、windows服务,或者使用所需的任何其他关闭触发器。

在其他情况下,应该不需要将取消侦听器注册到任何运行时关闭事件(如UnhandledExceptionProcessExit(,因为应用程序进程无论如何都会被拆除。托管概念是基于任务的异步,它不会产生任何后续进程或类似的资源,这些进程或资源将在Main退出后保持活动。

有关更多详细信息,请参阅Web主机和通用主机文档页面。

我刚刚发现了这个UseConsoleLifetime(),它可以在webHost构建器上设置:

public class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args) => 
Host.CreateDefaultBuilder(args)
.UseConsoleLifetime()
.ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());
}

现在Microsoft.Hosting.LifeTime为我处理取消令牌。太好了!

最新更新