在我的 C# 应用程序中,当它运行时,我可以在 Windows 任务管理器中清楚地看到句柄列的数量在稳步增加。内存很好,没有增加,只有句柄达到了很高的水平。
我怎样才能调试这个泄漏,检测它并解决句柄泄漏。
谢谢!
在我的 C# 应用程序中,当它运行时,我可以在 Windows 任务管理器中清楚地看到句柄列的数量在稳步增加。内存很好,没有增加,只有句柄达到了很高的水平。
我怎样才能调试这个泄漏,检测它并解决句柄泄漏。
谢谢!
我怀疑这是你要调试的东西;这是您将通过代码检查找到的东西。可能的原因:
未能处置 GDI 对象。你在使用 WinForms 吗?你using
对每支画笔和钢笔都有声明吗?
您的线程数是否随着句柄数的增加而增加?您是否正在启动从未完成的线程?
你在使用登录用户吗?关闭手柄?您必须非常小心地处理用户句柄。如果将登录句柄传递给 WindowsIdentity,则应在将其传递给 WindowsIdentity 后立即处理该句柄(在创建它的同一线程上。)
你在使用 SqlConnection 吗?它的游泳池保持开放的句柄。也许有些地方不对劲。
很久以前,我遇到了一个问题,即我延迟了一个 LogonUser 句柄。实际上,用户已断开连接,并且手柄已自动关闭。此后,我会在我认为是句柄的地方调用 CloseHandle。但是,.NET 中的句柄槽被重用。它们几乎总是有效的,但您无法分辨给定插槽中的对象类型。我实际上是在不经意间关闭了 SqlConnection 池对象。