c# - 如何在进程停止时取消虚拟主机

标签 c# .net asynchronous asp.net-web-api cancellation-token

我刚刚尝试在模板化 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 servicesystemd 。这基本上就是 UseWindowsServiceUseSystemd 扩展注册的内容,请参阅例如WindowServiceLifetimeHostBuilderExtensions source 。生命周期实现通常使用 IHostApplicationLifetime关闭应用程序。默认 Web 主机设置包括控制台生命周期。

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

没有必要将取消监听器注册到任何运行时关闭事件,例如 UnhandledExceptionProcessExit,因为应用程序进程无论如何都会被拆除。托管概念是基于基于任务的异步,它不会产生任何后续进程或类似的资源,这些资源在 Main 退出后仍保持事件状态。

更多详情,请参阅 Web HostGeneric Host文档页面。

关于c# - 如何在进程停止时取消虚拟主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64837558/

相关文章:

c# - C# 求两个时间的时间差

asynchronous - Cassandra 异步写入

.net - DataSet 与其他 .Net Collection 类的内存成本是多少?

c# - 如何使用初始字节连接到套接字

javascript - 当 Reactjs 组件中的 componentWillUnmount 时如何清除异步函数?

c# - 使用 Validator 时忽略 .NET 4 RTM MetadataType 属性

c# - 使用 NHibernate 映射时无法覆盖类

javascript - JQuery DatePicker 无效日期

sql - 根据点击的电影填充VIEW数据

c# - Puppeteer 启动后软件卡住