C# Windows窗体在执行期间引发与视觉样式相关的异常

C# Windows窗体在执行期间引发与视觉样式相关的异常,c#,.net,winforms,awesomium,C#,.net,Winforms,Awesomium,我有一个windows窗体应用程序,正常运行时不会出现问题,但经常(Hans Passant是正确的,这是一个GDI句柄泄漏。我无法在开发环境中复制它,因此需要向我的服务器添加一些日志记录。如果它对其他人有帮助,下面是我通过调用函数获取所需信息的方式 [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] static extern int GetGuiResources(IntPtr hPro

我有一个windows窗体应用程序,正常运行时不会出现问题,但经常(Hans Passant是正确的,这是一个GDI句柄泄漏。我无法在开发环境中复制它,因此需要向我的服务器添加一些日志记录。如果它对其他人有帮助,下面是我通过调用函数获取所需信息的方式

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern int GetGuiResources(IntPtr hProcess, int uiFlags);
并使用它获取句柄计数:

    var p = Process.GetCurrentProcess();
    kernel = p.HandleCount;

    gdiObjects = GetGuiResources(p.Handle, 0);
    userObjects = GetGuiResources(p.Handle, 1);

    gdiObjectsPeak = GetGuiResources(p.Handle, 2);
    userObjectsPeak = GetGuiResources(p.Handle, 4);

一旦设置好,我看到GDI对象在崩溃发生时达到10000上限。

很难解释这个异常,从未见过一次。你应该在程序中查找句柄泄漏。有三种句柄,TaskMgr.exe还可以显示用户对象和GDI对象。泄漏kernel32 Handl非常罕见e、 如果不在应该调用Dispose()时调用Dispose(),则很容易泄漏其他两个句柄。尤其是用户句柄很容易永久泄漏,比如Controls.Clear()或Remove()然后不处理删除的控件就可以了。您确实需要解释为什么在Taskmgr中不可见。exeI简化了我的故事。我实际上添加了12台服务器的日志记录,14小时后其中一台服务器再次发生崩溃。我确信计数器在Task Manager中是可见的,但监视是不可行的。