Kontinuierliche Erstellung von bitmaps führt zu Speicherverlust
Ich habe einen thread, der kontinuierlich erzeugt bitmaps und macht einen screenshot von einem anderen Programm-Fenster. Nun, ich habe eine pictureBox auf meiner form, und das ist, ständig aktualisiert mit den bitmaps generiert. Hier der code, ich habe in dem thread:
Bitmap bitmap = null;
while (true)
{
if (listBoxIndex != -1)
{
Rectangle rect = windowRects[listBoxIndex];
bitmap = new Bitmap(rect.Width, rect.Height);
Graphics g = Graphics.FromImage(bitmap);
IntPtr hdc = g.GetHdc();
PrintWindow(windows[listBoxIndex], hdc, 0);
pictureBox1.Image = bitmap;
g.ReleaseHdc(hdc);
}
}
Wie Sie sehen können, führt dies zu einem memory leak, da der kontinuierliche Aufruf von new Bitmap(rect.Width, rect.Höhe). Ich habe versucht, indem "bitmap".Dispose()" zu der Unterseite der while-Schleife, aber das führt zu der pictureBox das Bild auch entsorgt werden, wodurch eine riesige rote X anstelle des eigentlichen Bildes. Gibt es eine Möglichkeit, ich kann das entsorgen von "bitmap" ohne Entsorgung des pictureBox-Bild?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist auch "undicht" das Graphics-Objekt. Versuchen Sie dies:
using
der bitmap wird, entsorgen Sie es nach der Zuordnung zu IhremPictureBox
, die ist, was bewirkt, dass das bitmap nicht mehr zugegriffen werden kann, in den ersten Platz. Sie benötigen, um die bitmap-lebendig für die Dauer der Anzeige auf derPictureBox
.Image.Dispose()
Versionen des native image-pointer, Sie können überprüfen, dass die Quelle selbst.Bitmap.Dispose()
undusing Graphics g = Graphics.FromImage(Bitmap)
beseitigt-Speicherleck. Können Sie sagen, warum im FallGraphics g
erklärt, wie Schüler und instanziieren Sie es wieg = Graphics.FromImage(Bitmap); g.Dispose()
Speicher nicht freigegeben?Den beantworteten Beispiel hat ein Leck mit Grafiken g
nach
g.ReleaseHdc(..);
Erinnern zu dipose die graphics-variable
wie zum Beispiel: