我是C#的新手。我需要在工作线程中重复刷新GUI画框。图像是从一个轮询驱动程序的相机获取的,使用GetImage方法检索要显示的图像。即使我使用"using"指令分配位图并显式调用G.C,内存似乎永远不会被释放。
工作线程类似于以下内容:
while (true)
{
// request image with IR signal values (array of UInt16)
image = axLVCam.GetImage(0);
lut = axLVCam.GetLUT(1);
DrawPicture(image, lut);
//GC.Collect();
}
虽然 DrawPicture 方法大致如下:
public void DrawPicture(object image, object lut)
{
[...]
// We have an image - cast it to proper type
System.UInt16[,] im = image as System.UInt16[,];
float[] lutTempConversion = lut as float[];
int lngWidthIrImage = im.GetLength(0);
int lngHeightIrImage = im.GetLength(1);
using (Bitmap bmp = new Bitmap(lngWidthIrImage, lngHeightIrImage)) {
[...many operation on bitmap pixel...]
// Bitmap is ready - update image control
//SetControlPropertyThreadSafe(tempTxtBox, "Text", string.Format("{0:0.#}", lutTempConversion[im[160, 100]]));
//tempTxtBox.Text = string.Format("{0:00000}", im[160, 100]);
//System.Drawing.Image.FromHbitmap(bmp.GetHbitmap());
pic.Image = System.Drawing.Image.FromHbitmap(bmp.GetHbitmap());
}
}
使用 pic.Image = System.Drawing.Image.FromHbitmap(bmp.GetHbitmap());
这行代码会导致问题。实际上,如果将此行代码注释掉,则垃圾收集器可以正常工作。更好地说,问题似乎出在 System.Drawing.Image.FromHbitmap(bmp.GetHbitmap())
上。有什么建议来解决这个内存泄漏问题吗?
非常感谢!
FromHbitmap()
时分配的非托管资源。然而,当前的解决方案忽略了在调用GetHbitmap()
时创建的非托管 GDI 对象。 - Yannick MottonBitmap
变量,但是我忽略了一个Graphics
对象。亲爱的读者们:不要忘记为您使用的每个对象正确地处理(或使用using
语句)。它们很容易被忽视,但如果您这样做,您的诊断内存使用量将会不断增加。最后,在分配PictureBox
的.Image
属性时,您可能需要分配对象的.Clone()
(需要进行强制转换)。 - Chad