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

.NET 6中点击控制台X按钮关闭应用时Singleton依赖未释放的解决办法

.NET 6控制台Web应用关闭时释放Singleton依赖项的解决方案

问题场景

在.NET 6控制台Web应用中,存在实现IDisposable的Singleton依赖项,需要在应用退出前确保其被释放。目前发现:

  • 使用Ctrl+C关闭应用时,依赖项的Dispose方法会被正常调用
  • 点击控制台窗口的关闭按钮(X)时,依赖项不会被释放,导致资源无法正常清理

复现代码

Program.cs

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton<SomeDependency>(_ => new SomeDependency());

var app = builder.Build();

// 初始化依赖项
app.Services.GetService<SomeDependency>();

app.Run();

SomeDependency.cs

public class SomeDependency : IDisposable
{
    public void Dispose()
    {
        File.Delete("test.txt");
    }
}

运行上述代码并创建test.txt文件后:

  • 按Ctrl+C关闭应用,test.txt会被删除
  • 点击控制台X按钮关闭应用,test.txt不会被删除

解决方案

通过订阅AppDomain.CurrentDomain.ProcessExit事件,在进程退出时手动触发服务容器的释放逻辑,确保所有Singleton依赖项被正确清理:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton<SomeDependency>(_ => new SomeDependency());

var app = builder.Build();

// 订阅进程退出事件,触发服务容器释放
AppDomain.CurrentDomain.ProcessExit += (sender, e) =>
{
    app.Services.Dispose();
};

// 初始化依赖项
app.Services.GetService<SomeDependency>();

app.Run();

原理说明

  • Ctrl+C会触发.NET的优雅退出流程,WebApplication会自动调用服务容器的Dispose方法,进而释放所有实现IDisposable的Singleton依赖。
  • 点击控制台X按钮时,操作系统会直接向进程发送终止信号,.NET默认不会触发优雅退出流程,因此需要通过ProcessExit事件捕获进程退出时机,手动触发服务容器的释放操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:06:23