You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以编程方式正确终止ASP.NET Core应用程序?

ASP.NET Core 编程式终止应用未完全退出的问题

问题场景

你的Startup类简化代码:

public void ConfigureServices(IServiceCollection services)
{
  return;
  ...
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  return;
  ...
}

你在Program中尝试1分钟后自动终止应用的代码:

IHost host = BuildHost(args); // custom method

IHostLifetime lifetime = (IHostLifetime)host.Services.GetService(typeof(IHostLifetime));
Task.Run(async () =>
{
  await Task.Delay(TimeSpan.FromMinutes(1)).ConfigureAwait(false);
  Console.WriteLine($"Stopping at {DateTimeOffset.Now}");
  await lifetime.StopAsync(CancellationToken.None).ConfigureAwait(false);
  Console.WriteLine("Stopped");
});

host.Run();

Console.WriteLine("THE END");

运行后应用启动正常,1分钟后调用StopAsync并显示"Stopped",但始终看不到"THE END",说明应用未完全终止。

解决方案

不要直接操作IHostLifetime,而是通过IHost实例调用StopAsync,同时改用异步的RunAsync()方法并等待完成,修改后的代码如下:

IHost host = BuildHost(args);

// 后台任务触发终止
_ = Task.Run(async () =>
{
    await Task.Delay(TimeSpan.FromMinutes(1));
    Console.WriteLine($"Stopping at {DateTimeOffset.Now}");
    // 调用主机的StopAsync而非直接操作IHostLifetime
    await host.StopAsync(CancellationToken.None);
    Console.WriteLine("Stopped");
});

// 使用异步的RunAsync并等待,确保主机完全停止后执行后续代码
await host.RunAsync();

Console.WriteLine("THE END");

原因说明

  1. host.Run()的阻塞特性:Run()是同步阻塞方法,只有当主机完全终止后才会返回。直接调用IHostLifetime.StopAsync无法触发Run()的退出逻辑,导致后续代码永远无法执行。
  2. IHost.StopAsync的完整性:主机自身的StopAsync方法会处理完整的终止流程,包括关闭所有托管服务、释放资源、通知IHostLifetime完成终止,确保整个应用生命周期正确收尾。
  3. 异步等待的必要性:RunAsync()返回的Task会在主机完全停止时完成,等待该Task能保证后续的"THE END"代码在应用真正终止后执行。

内容的提问来源于stack exchange,提问作者greenoldman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 06:13:27