Начиная с 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
был последний раз нарисован.