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