我刚刚尝试在模板化 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 需要一个取消 token ,我希望它基于应用程序关闭。
我的问题 - 在此处设置链接回进程关闭的取消 token 的正确(标准)方法是什么?
我可以做这样的事情:
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
的现有实现包括 console , windows service和 systemd 。这基本上就是 UseWindowsService
和 UseSystemd
扩展注册的内容,请参阅例如WindowServiceLifetimeHostBuilderExtensions source 。生命周期实现通常使用 IHostApplicationLifetime关闭应用程序。默认 Web 主机设置包括控制台生命周期。
使用这种方法,可以将单个应用程序配置为控制台应用程序、Windows 服务,或使用所需的任何其他关闭触发器。
没有必要将取消监听器注册到任何运行时关闭事件,例如 UnhandledException
或 ProcessExit
,因为应用程序进程无论如何都会被拆除。托管概念是基于基于任务的异步,它不会产生任何后续进程或类似的资源,这些资源在 Main
退出后仍保持事件状态。
更多详情,请参阅 Web Host和 Generic Host文档页面。
关于c# - 如何在进程停止时取消虚拟主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64837558/