ASP.NET Core中的应用程序生命周期指的是应用程序从启动到完全停止的整个运行过程,这个过程由宿主(Host)统一管理,开发者可以通过内置的接口监听生命周期中的关键节点,在对应阶段执行自定义逻辑,比如服务初始化、资源清理、健康检查等。

ASP.NET Core应用程序生命周期的核心管理接口
ASP.NET Core中管理应用程序生命周期的核心接口是IHostApplicationLifetime,这个接口定义了三个用于通知生命周期状态变更的取消令牌,以及一个主动停止应用的触发方法,开发者可以通过依赖注入获取这个接口的实例来操作生命周期相关逻辑。
IHostApplicationLifetime接口的定义如下:
public interface IHostApplicationLifetime
{
// 应用程序启动完成后触发的取消令牌
CancellationToken ApplicationStarted { get; }
// 应用程序开始停止时触发的取消令牌
CancellationToken ApplicationStopping { get; }
// 应用程序完全停止后触发的取消令牌
CancellationToken ApplicationStopped { get; }
// 主动触发应用程序停止的方法
void StopApplication();
}
应用程序生命周期的三个核心事件
基于IHostApplicationLifetime接口,ASP.NET Core的应用程序生命周期包含三个核心事件,分别对应应用运行的不同阶段:
1. ApplicationStarted事件
这个事件在应用程序完成所有启动流程,已经可以正常接收和处理请求时触发。适合在这个事件中执行初始化逻辑,比如预热缓存、初始化第三方服务连接、打印启动完成日志等。
2. ApplicationStopping事件
这个事件在应用程序收到停止请求,开始执行停止流程但尚未完全停止时触发。此时应用还在运行,但是已经不再接收新的请求。适合在这个事件中执行优雅关闭逻辑,比如释放占用的资源、保存未持久化的数据、断开外部服务连接等。
3. ApplicationStopped事件
这个事件在应用程序完全停止后触发,此时所有的请求都已经处理完毕,所有后台服务也都已经停止。适合在这个事件中执行最终的清理逻辑,比如释放最后剩余的资源、记录应用停止的日志等。
如何在代码中监听和使用生命周期事件
开发者可以通过两种方式监听生命周期事件,一种是在配置服务时注册生命周期回调,另一种是在控制器或者其他服务中注入IHostApplicationLifetime实例来监听事件。
方式一:在Program.cs中注册回调
在应用程序的启动配置阶段,可以直接通过IHostApplicationLifetime注册各个事件的回调方法,示例代码如下:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// 获取IHostApplicationLifetime实例
var lifetime = app.Services.GetRequiredService<IHostApplicationLifetime>();
// 注册启动完成事件回调
lifetime.ApplicationStarted.Register(() =>
{
Console.WriteLine("应用程序启动完成,开始接收请求");
});
// 注册开始停止事件回调
lifetime.ApplicationStopping.Register(() =>
{
Console.WriteLine("应用程序开始停止,正在释放资源");
});
// 注册完全停止事件回调
lifetime.ApplicationStopped.Register(() =>
{
Console.WriteLine("应用程序已经完全停止");
});
app.MapGet("/", () => "Hello World!");
app.Run();
方式二:在自定义服务中注入使用
也可以将IHostApplicationLifetime注入到自定义的服务中,在服务内部监听生命周期事件,适合将生命周期相关的逻辑封装到独立服务中,示例代码如下:
// 自定义生命周期监听服务
public class LifetimeMonitorService : IHostedService
{
private readonly IHostApplicationLifetime _lifetime;
public LifetimeMonitorService(IHostApplicationLifetime lifetime)
{
_lifetime = lifetime;
}
public Task StartAsync(CancellationToken cancellationToken)
{
// 注册生命周期事件回调
_lifetime.ApplicationStarted.Register(OnStarted);
_lifetime.ApplicationStopping.Register(OnStopping);
_lifetime.ApplicationStopped.Register(OnStopped);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
private void OnStarted()
{
Console.WriteLine("自定义服务监听:应用程序启动完成");
}
private void OnStopping()
{
Console.WriteLine("自定义服务监听:应用程序开始停止");
}
private void OnStopped()
{
Console.WriteLine("自定义服务监听:应用程序完全停止");
}
}
然后在Program.cs中注册这个自定义服务:
var builder = WebApplication.CreateBuilder(args);
// 注册自定义生命周期监听服务
builder.Services.AddHostedService<LifetimeMonitorService>();
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
主动停止应用程序
除了等待应用程序自然停止,开发者还可以通过调用IHostApplicationLifetime的StopApplication方法主动触发应用程序停止流程,比如在接收到特定的管理请求时停止应用,示例代码如下:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/stop", (IHostApplicationLifetime lifetime) =>
{
// 主动触发应用停止
lifetime.StopApplication();
return "应用程序正在停止";
});
app.Run();
生命周期事件执行顺序说明
当应用程序正常启动和停止时,各个事件的执行顺序如下:
- 启动阶段:先完成所有服务的初始化和配置,然后触发ApplicationStarted事件
- 停止阶段:先触发ApplicationStopping事件,然后停止所有后台服务和请求处理,最后触发ApplicationStopped事件
如果开发者主动调用StopApplication方法,也会按照上述停止阶段的顺序执行对应的事件回调。
ASP.NET_Core应用程序生命周期生命周期事件IHostApplicationLifetime修改时间:2026-06-16 16:57:40