使用位图对象而不锁定资源

本文关键字:锁定 资源 对象 位图 | 更新日期: 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之类的东西,但是学院提到最好不要使用这些方法,因为它们可能会导致不可预测的问题。

有什么指导和建议吗?

使用位图对象而不锁定资源

您所描述的"常见方法"是IDisposableDispose()方法,最常见的是通过using暴露。如果这在特定示例中不起作用,那么该特定示例中可能存在编码错误。这个bug不会改变通用的方法。

这是一个例子;试着把它加载到内存中:

var data = File.ReadAllBytes(path);
var ms = new MemoryStream(data);
MyImage = Bitmap.FromStream(ms);