通用主机 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() 方法来停止应用。
停止应用流程图示
此图展示了主机如何处理系统的停止信号的。
应用会拦截系统停止信号,返回取消操作来避免强制退出。进而转入自己的正常退出程序。
This post is licensed under CC BY 4.0 by the author.