我有一个不断生成位图的线程,并获取另一个程序窗口的屏幕截图。现在,我的表单上有一个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);
}
}
正如您所看到的,由于连续调用新的Bitmap(rect.Width,rect.Height),这会导致内存泄漏。我已经尝试将“bitmap.Dispose()”添加到while循环的底部,但这导致pictureBox的图像也被处理掉,这使得一个巨大的红色X代替了实际的图像。有没有办法在不丢弃pictureBox图像的情况下处理“位图”?
答案 0 :(得分:10)
你也在“泄漏”Graphics对象。试试这个:
while (true)
{
if (listBoxIndex != -1)
{
Rectangle rect = windowRects[listBoxIndex];
Bitmap bitmap = new Bitmap(rect.Width, rect.Height);
using (Graphics g = Graphics.FromImage(bitmap))
{
IntPtr hdc = g.GetHdc();
try
{
PrintWindow(windows[listBoxIndex], hdc, 0);
}
finally
{
g.ReleaseHdc(hdc);
}
}
if (pictureBox1.Image != null)
{
pictureBox1.Image.Dispose();
}
pictureBox1.Image = bitmap;
}
}
答案 1 :(得分:1)
回答的例子与图形g有泄漏
在g.ReleaseHdc(..);
之后
请记住使用图形变量
例如:
g.Dispose();