摘要:在ASP.NET Core 中,通用主机是一个很重要的对象,它提供了一种统一的方式来管理应用程序的生命周期、依赖注入、配置和日志等功能。通过Generic Host,ASP.NET Core 不仅可以用来构建 Web 应用,还能用于构建后台任务、定时服务等其他
1. 引言
在ASP.NET Core 中,通用主机是一个很重要的对象,它提供了一种统一的方式来管理应用程序的生命周期、依赖注入、配置和日志等功能。通过Generic Host,ASP.NET Core 不仅可以用来构建 Web 应用,还能用于构建后台任务、定时服务等其他类型的应用程序。
通用主机(Generic Host) 是 .NET 提供的一种统一的托管模型,负责管理应用程序的生命周期。它可以用来启动和运行各种类型的应用程序,例如 Web 应用、后台服务、消息队列、定时任务等。
await Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHostedService; }) .ConfigureLogging(logging => { logging.ClearProviders; logging.AddConsole; }).Build .RunAsync;public class SampleHostedService : IHostedService{ ILogger _log; public SampleHostedService(ILogger logger) { _log = logger; } public Task StartAsync(CancellationToken cancellationToken) { _log.LogDebug("Start Sample Host"); return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { _log.LogDebug("End Sample Host"); return Task.CompletedTask; }}方法后,宿主进入运行状态,生命周期如下:初始化和启动托管服务:执行所有实现了IHostedService的服务的StartAsync方法,代码中,SampleHostedService是一个托管服务,因此 RunAsync会调用它的StartAsync方法。
启动应用的主循环:RunAsync方法会阻塞当前线程,并保持宿主运行。如果你的托管服务包含持续运行的逻辑(如队列处理、定时任务等),它会在这里一直运行。
等待应用终止信号:RunAsync会监听终止信号,例如Ctrl+C(在控制台应用中)或操作系统发出的停止事件。收到信号时,宿主会触发应用的终止流程。
在宿主收到终止信号(如应用程序退出或CancellationToken被触发)时,进入清理阶段:调用托管服务的 StopAsync 方法:宿主依次调用每个托管服务的StopAsync方法,用于释放资源或执行清理操作。
清理资源: 释放依赖注入容器和日志系统等资源。完成运行:RunAsync方法返回,宿主完全停止4. 通用主机的生命周期
通用主机生命周期主要分为三个主要阶段:
启动阶段:初始化配置、依赖注入、日志。调用托管服务的StartAsync方法。
运行阶段:持续监听并运行服务逻辑。等待终止信号。
停止阶段:调用托管服务的StopAsync方法。清理资源,关闭应用。
5. 使用场景
RunAsync是适合于长时间运行的服务或后台任务的典型入口方法,比如:Web 服务器(如 ASP.NET Core 应用)。
消息队列消费者。
定时任务处理器。
RunAsync,你可以确保宿主的生命周期被完整地管理,从启动到停止均可以处理清楚。源代码地址:
来源:opendotnet