我想知道为什么垃圾收集器无法追踪位图非托管部分使用的内存量,并在需要时释放此资源。
当后台线程中的循环调用以下函数一段时间后,我发现它引起异常:
private delegate void setImageCallback();
private void showFrame()
{
if (pboxCam.InvokeRequired)
{
this.Invoke(new setImageCallback(showFrame));
}
else
{
Bitmap bmp = new Bitmap(getBitmapFromCam());
Graphics g = Graphics.FromImage(bmp);
g.DrawRectangle(RectanglePen, 10, 10, 50, 30);
g.Dispose();
pboxCam.Image = bmp;
}
}
我尝试在函数末尾释放bmp,但是picturebox不再显示图像了。 下面的解决方案确实起作用,但有些我不喜欢的地方。你认为呢?
Bitmap bmp;
private delegate void setImageCallback();
private void showFrame()
{
if (pboxCam.InvokeRequired)
{
this.Invoke(new setImageCallback(showFrame));
}
else
{
if (bmp!=null) bmp.Dispose();
bmp = new Bitmap(getBitmapFromCam());
Graphics g = Graphics.FromImage(bmp);
g.DrawRectangle(RectanglePen, 10, 10, 50, 30);
g.Dispose();
pboxCam.Image = bmp;
}
}
PictureBox
吗? - Hamlet Hakobyan