Ich leide an einer OutOfMemoryException beim Abrufen eines Image aus einer ImageList Ich konnte keine geeignete Lösung für das Problem finden.ImageList/Image OutOfMemoryException
Ich habe ein benutzerdefiniertes ListView-Steuerelement, das ein Ereignis für das Zeichnen von ListViewItems angefügt hat. Dies ruft dann eine statische Methode auf, die den Gegenstand zeichnen soll.
Für eine ListView von etwa 300 Elementen, bekommen wir den Speichersprung um 100 MB jedes Mal, wenn die ListView gescrollt wird. Der säumige Code wurde auf die folgende aufgespürt:
Image image = item.ImageList.Images[item.ImageKey];
if (image != null)
{
Size imageOffset = new Size((bounds.Width - image.Width)/2, 2);
Point imagePosition = bounds.Location + imageOffset;
graphics.DrawImageUnscaled(image, imagePosition);
}
Es scheint (sicherlich auf WinXP), dass die Garbage Collection nicht richtig funktioniert, so dass der Speicher winden. Wir haben versucht, image.Dispose() direkt nach dem Codeblock hinzuzufügen, um das Problem zu beheben. Dies hat jedoch keine Auswirkungen.
Die einzige Lösung, die ich bisher gefunden habe, ist am Ende der statischen Methode, GC.Collect() aufzurufen. Das Problem dabei ist jedoch, dass es dann dazu führt, dass sich das ListView langsam neu malt und Sie Artefakte auf dem Bildschirm erhalten, während es versucht, es erneut zu zeichnen.
Hat jemand anderes das erlebt? Oder kennt einen Workaround?
Ich habe OutOfMemoryExceptions auf zwei verschiedene Anwendungen erfahren, keiner von ihnen Bilder oder Listview beteiligt sind. Unglücklicherweise war die einzige Lösung, die ich finden konnte, GC_Collect() immer wieder aufzurufen. – Crispy