我们为 Windows Forms UI 渲染引擎开发了一个小型测试套件,它允许在以自动方式运行测试用例时测量性能并检测内存泄漏。现在我们还要检查手柄是否泄漏。在桌面平台上我们可以使用这段代码:
[DllImport("User32")]
private extern static int GetGuiResources(IntPtr hProcess, int uiFlags);
using (var process = Process.GetCurrentProcess())
{
var gdiHandles = GetGuiResources(process.Handle, 0);
var userHandles = GetGuiResources(process.Handle, 1);
}
这个方法在Windows Mobile上好像不可用。是否有另一种方法可以在 Windows Mobile/CE 上以编程方式确定这些值?
这更多的是一个建议而不是一个答案。
您可能要求将所有“句柄”方法放置在一个单独的类中(我有一个名为User32
, coreDLL
, etc).
然后,您可以在每次使用资源时增加计数器,或者在将句柄传回之前将您创建的每个新句柄添加到私有管理列表中。
现在,在项目关闭之前,请确保计数器返回到零或列表中的所有句柄都已关闭。
未经测试的代码 - 我现在没有 VS2008。
[DllImport("User32")]
private extern static int GetGuiResources(IntPtr hProcess, int uiFlags);
private static List<IntPtr> m_handles = new List<IntPtr>();
public static IntPtr[] GetGuiResources() {
using (var process = Process.GetCurrentProcess())
{
var gdiHandles = GetGuiResources(process.Handle, 0);
m_handles.Add(gdiHandles);
var userHandles = GetGuiResources(process.Handle, 1);
m_handles.Add(userHandles);
}
return new IntPtr[] { m_handles[m_handles.Count - 2], m_handles[m_handles.Count - 1] };
}
public static void Close() {
for (int i = m_handles.Count - 1; -1 < i; i--) {
var handle = m_handles[i];
// release your handle
}
}
再说一次,这只是一个想法。我以前从未遇到过这个问题,所以我不知道它的效果如何,或者是否会因某些“我未知”的原因而失败。
这就是我开始该项目的逻辑方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)