Ich bin ein Newby in C#. Ich muss ein GUI-Bildfeld in einem Worker-Thread wiederholt aktualisieren. Das Bild wird von einer Kamera erfasst, die einen Treiber mit einer GetImage-Methode abfragt, die das anzuzeigende Bild abruft. Selbst wenn ich die Bitmap mit der Direktive "using" zuteile und G.C explizit anrufe, scheint der Speicher nie freigegeben zu werden.C# picturebox Speicherfreigabe Problem
der Arbeiter-Thread ist etwa wie folgt:
while (true)
{
// request image with IR signal values (array of UInt16)
image = axLVCam.GetImage(0);
lut = axLVCam.GetLUT(1);
DrawPicture(image, lut);
//GC.Collect();
}
Während die DrawPicture Methode
so ähnlich istpublic 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());
}
}
Probleme ergibt sich bei der
pic.Image = System.Drawing .Image.FromHbitmap (bmp.GetHbitmap());
In der Tat kommentieren diese Codezeile Garbage Collection so wie es wäre. Besser, scheint das Problem mit
System.Drawing.Image.FromHbitmap (bmp.GetHbitmap())
Jeder Beratung, um dieses Speicherleck zu lösen?
Vielen Dank!
Das Problem ist, dass er kein GDI-Objekt entsorgt. –
@ Yannick: guter Punkt. Ich kann mir vorstellen, dass beide Probleme Probleme für den Garbage Collector verursachen. –
In der Tat verfügen Sie durch den Aufruf von Dispose on Image über nicht verwaltete Ressourcen, die beim Aufruf von 'FromHbitmap()' zugewiesen werden. Die aktuelle Lösung ignoriert jedoch das nicht verwaltete GDI-Objekt, das beim Aufruf von "GetHbitmap()" erstellt wird. –