Post

通用主机 IHost 和生命周期

通用主机是 dotnet 运行时库提供的功能。

通用主机与web主机的区别在于,前者去掉了Http管道相关的内容。只保留了 依赖注入、Logging、Configuration、HostedService等内容。

通用主机在启动时,调用配置好的Service的StartAsync方法。也就是异步启动服务。

服务继承自 IHostService,包括两种类型,一种BackgroundService,和HostedLifetimeService. 如其名,一个是独立于主机进程的背景服务,另一种是被主机进程管理的,参与主机生命周期的服务。

// 两种创建通用主机的方法。
// 1. IHostApplicationBuilder 
var builder = Host.CreateApplicationBuilder();
builder.Services.AddHostedService<Worker>();
// 2. IHostBuilder
var builder = Host.CreateDefaultBuilder();
builder.ConfigureServices(services=>{
  services.AddHostService<Worker>();
})

CreateXXXBuilder 方法都会进行以下动作:

  • 设置当前路径
  • 添加环境变量和命令行参数
  • 加载配置文件
  • 添加日志记录提供程序
  • 依赖关系验证

当执行 Host.Builder() 时,会自动注册生命周期服务

当主机处于生命周期时,控制台的 结束信号 或者 内部故障都会导致应用程序停止。

使用 UseConsoleLifetime(Action) 可以让应用监控控制台的结束信号,从而执行正常结束应用的过程。

应用也可以调用 Environment.Exit() 方法来停止应用。

停止应用流程图示

Hosting shutdown sequence diagram.

此图展示了主机如何处理系统的停止信号的。

应用会拦截系统停止信号,返回取消操作来避免强制退出。进而转入自己的正常退出程序。

This post is licensed under CC BY 4.0 by the author.