我有一个线程,不断生成位图并截取另一个程序窗口的屏幕截图。现在,我在我的窗体上有一个pictureBox,它不断地使用生成的位图更新。这是我在线程中的代码:
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);
}
}
正如您所见,由于对new Bitmap(rect.Width, rect.Height)的不断调用,这导致了内存泄漏。我尝试在while循环底部添加"bitmap.Dispose()",但这会导致pictureBox的图像也被释放,从而在实际图像位置上产生一个巨大的红色X。有没有办法在不释放pictureBox图像的情况下处理"bitmap"?
Image.Dispose()
会释放本地图像指针,您可以自行查看源代码。 - LuceroBitmap.Dispose()
和using Graphics g = Graphics.FromImage(Bitmap)
消除了内存泄漏。你能说一下为什么在将Graphics g
声明为类成员并像这样实例化它g = Graphics.FromImage(Bitmap); g.Dispose()
时不会释放内存吗? - EpiGen