使用位图对象而不锁定资源
本文关键字:锁定 资源 对象 位图 | 更新日期: 2023-09-27 18:03:12
从Hans Passant
在上一个问题中给出的答案中,我了解到:
MyImage = new Bitmap(openFileDialog1.FileName);
pictureBox1.Image = (Image)MyImage;
是的,这段代码对文件加了锁。锁是由一个内存映射文件对象,GDI+创建该对象以有效地映射将像素数据的文件放入内存中,而不必在内存中分配空间分页文件。您将无法删除该文件,只要图像显示在图片框中而未被处理,锁住防止。
这个问题是关于一个错误(有时),当我试图从PictureBox
中删除以前使用的图像。似乎在这种情况下,甚至调用
if (MyImage != null)
{
MyImage.Dispose();
}
不能保证在删除映像时(我猜这可能是任何类型的非托管资源)它将被处理。
所以我有两个问题-第一个与我目前在PictureBox
中使用BitMap
以及由此引起的资源锁定的问题有关。我看到这不是在PictureBox
中显示图像的唯一方法,所以是否有另一种方法不会导致此问题,并保证图像在我需要的时候被释放以删除。
我的第二个问题——当我必须在。net中使用非托管资源并且我需要对它们进行Delete
之类的操作时,基本方法是什么?我想这个问题可能会在。net中处理任何类型的非托管资源时出现,是否有一种通用的方法来解决在特定时刻锁定/释放资源而不依赖Garbage Collector
的问题(这显然会时不时地失败,因为它可能需要不同的时间来释放)。我看到有些人使用GC...
方法显式调用finilizer
之类的东西,但是学院提到最好不要使用这些方法,因为它们可能会导致不可预测的问题。
有什么指导和建议吗?
您所描述的"常见方法"是IDisposable
和Dispose()
方法,最常见的是通过using
暴露。如果这在特定示例中不起作用,那么该特定示例中可能存在编码错误。这个bug不会改变通用的方法。
这是一个例子;试着把它加载到内存中:
var data = File.ReadAllBytes(path);
var ms = new MemoryStream(data);
MyImage = Bitmap.FromStream(ms);