.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
相关产品推荐
相关产品推荐

