我刚刚尝试在模板化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。这基本上是UseWindowsService
和UseSystemd
扩展注册的内容,请参阅例如WindowServiceLifetimeHostBuilderExtensions源代码。Lifetime实现通常使用IHostApplicationLifetime来关闭应用程序。默认的web主机设置包括控制台生存期。
使用这种方法,可以将单个应用程序配置为控制台应用程序、windows服务,或者使用所需的任何其他关闭触发器。
在其他情况下,应该不需要将取消侦听器注册到任何运行时关闭事件(如UnhandledException
或ProcessExit
(,因为应用程序进程无论如何都会被拆除。托管概念是基于任务的异步,它不会产生任何后续进程或类似的资源,这些进程或资源将在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
为我处理取消令牌。太好了!