Mam wątek, który ciągle generuje bitmapy i wykonuje zrzut ekranu okna innego programu. Teraz mam pictureBox w mojej formie i to jest ciągle aktualizowane z wygenerowanymi bitmapami. Oto kod mam w wątku:Ciągłe tworzenie bitmap prowadzi do wycieku pamięci
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);
}
}
Jak widać, prowadzi to do wycieku pamięci, ze względu na ciągłe wezwanie do nowej bitmapy (rect.Width, rect.Height). Próbowałem dodać "bitmap.Dispose()" na końcu pętli while, ale to prowadzi do zdjęcia obrazu PictureBox również, który sprawia, że gigantyczne czerwone X zamiast rzeczywistego obrazu. Czy istnieje sposób, w jaki mogę zlikwidować "bitmapę" bez pozbycia się obrazu pictureBox?
No właśnie. Jak słowo kluczowe "przysyp"? Zmodyfikowałem swój kod. Dzięki! – user1440308
"Używanie" bitmapy spowoduje jej usunięcie po przypisaniu jej do 'PictureBox', co powoduje, że bitmapa staje się w pierwszej chwili niedostępna. Musisz zachować bitmapę przy życiu przez cały czas jej wyświetlania na "PictureBox". – Lucero
@ xmenW.K. Co dokładnie nie jest prawdą? 'Image.Dispose()' zwalnia natywny wskaźnik obrazu, możesz sam sprawdzić źródło. – Lucero