我是C#中的一個newby。我必須重複刷新工作線程中的GUI圖片框。該圖像是從照相機中獲取的,該圖像通過GetImage方法來輪詢驅動程序,該方法回顧要顯示的圖像。即使我使用指令「using」分配位圖並顯式調用G.C,內存似乎也不會解除分配。c#picturebox內存釋放問題
工作者線程是這樣的:
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())
任何建議來解決此內存泄漏?
非常感謝!
問題是他沒有配置GDI對象。 – 2009-12-02 09:44:39
@Yannick:好點。我想象這兩個問題都會爲垃圾收集器產生問題。 – 2009-12-02 09:51:07
事實上,通過調用Dispose on Image,您可以調用在調用'FromHbitmap()'時分配的非託管資源。然而,當前的解決方案忽略調用'GetHbitmap()'時創建的非託管GDI對象。 – 2009-12-02 09:56:57