【发布时间】:2016-04-18 20:42:49
【问题描述】:
如果我有一些Bitmap bmp1 并将PictureBox.Image 设置为bmp1,那么稍后将其设置为Bitmap bmp2,bmp1 是否由PictureBox 正确处理或者我需要保留参考一旦我将Image 更改为bmp2 ,它就变为bmp1 和Dispose?
【问题讨论】:
如果我有一些Bitmap bmp1 并将PictureBox.Image 设置为bmp1,那么稍后将其设置为Bitmap bmp2,bmp1 是否由PictureBox 正确处理或者我需要保留参考一旦我将Image 更改为bmp2 ,它就变为bmp1 和Dispose?
【问题讨论】:
PictureBox 无法知道您是否要处理该图像——您可能在应用程序的其他地方使用它。所以它没有明确地Dispose 它。如果PictureBox 持有对它的最后一个引用,则它有资格进行垃圾收集,并且Dispose 将作为终结的一部分被调用,但何时发生这种情况取决于垃圾收集器。与此同时,尚未处置的Bitmap 正在消耗非托管资源,并且很可能会保持一个流打开,这将阻止对源文件的修改,因此让事情“随时”被清理是不好的做法。
如果您知道在更改 PictureBox.Image 指向的内容时已经完成了 Bitmap,请在此处添加额外的几行以处理旧的,然后您就完成了:
Image tmp = myPictureBox.Image;
myPictureBox.Image = newImage;
if (tmp != null)
{
tmp.Dispose();
}
【讨论】: