0

在我的 C# 应用程序中,当它运行时,我可以在 Windows 任务管理器中清楚地看到句柄列的数量在稳步增加。内存很好,没有增加,只有句柄达到了很高的水平。

我怎样才能调试这个泄漏,检测它并解决句柄泄漏。

谢谢!

4

1 回答 1

0

我怀疑这是你要调试的东西;这是您将通过代码检查找到的东西。可能的原因:

  1. 未能处置 GDI 对象。你在使用 WinForms 吗?你using对每支画笔和钢笔都有声明吗?

  2. 您的线程数是否随着句柄数的增加而增加?您是否正在启动从未完成的线程?

  3. 你在使用登录用户吗?关闭手柄?您必须非常小心地处理用户句柄。如果将登录句柄传递给 WindowsIdentity,则应在将其传递给 WindowsIdentity 后立即处理该句柄(在创建它的同一线程上。)

  4. 你在使用 SqlConnection 吗?它的游泳池保持开放的句柄。也许有些地方不对劲。

很久以前,我遇到了一个问题,即我延迟了一个 LogonUser 句柄。实际上,用户已断开连接,并且手柄已自动关闭。此后,我会在我认为是句柄的地方调用 CloseHandle。但是,.NET 中的句柄槽被重用。它们几乎总是有效的,但您无法分辨给定插槽中的对象类型。我实际上是在不经意间关闭了 SqlConnection 池对象。

于 2015-01-27T16:09:00.833 回答