Ray Vega's answer のGDIViewから始めて、次のヒントを見つけました。
[DllImport("User32")]
extern public static int GetGuiResources(IntPtr hProcess, int uiFlags);
public static void GetGuiResourcesGDICount()
{
//Return the count of GDI objects.
Console.WriteLine("GDICount"+GetGuiResources(System.Diagnostics.Process.GetCurrentProcess().Handle, 0));
}
private void button1_Click(object sender, System.EventArgs e)
{
GetGuiResourcesGDICount();
}
GDIView は、リークされたのはフォント オブジェクトであると通知しました。次に、ロギング コードに への呼び出しを追加しGetGuiResources
て、オブジェクトの作成がトリガーされた時点を検出しました。
私たちの場合、Label
親UserControl
がバックグラウンド ウィンドウで非表示になっているときに、コントロールのテキストが更新されました。これにより、GDI がフォント ハンドルをリークする可能性があります。Label
これを修正するために、現在画面に表示されていない限りを更新しないようにロジックを変更しました。UserControl
表示されたかどうかを判断するために、が最後に描かれた時期を記録しています。