2

从上一个问题的答案中,Hans Passant我了解到:

 MyImage = new Bitmap(openFileDialog1.FileName);
 pictureBox1.Image = (Image)MyImage;

是的,该代码锁定了文件。锁是由 GDI+ 创建的内存映射文件对象产生的,它可以有效地将文件的像素数据映射到内存中,而无需在分页文件中分配空间。只要图像显示在图片框中并且未处理,您将无法删除文件,锁定可以防止这种情况。

问题是当我尝试从PictureBox. 似乎在这种确切的情况下甚至调用:

if (MyImage != null)
{
    MyImage.Dispose();
}

不保证在删除图像的时候(我猜这可能是任何类型的非托管资源)它会被处理掉。

所以我有两个问题 - 第一个问题与我当前使用BitMapinPictureBox和由此引起的资源锁定问题有关。我看到这不是在内部显示图像的唯一方法,PictureBox所以还有另一种不会导致此问题的方法,并且可以保证在我需要的任何时候释放图像以将其删除。

我的第二个问题 - 当我必须在 .NET 中使用非托管资源并且我需要对它们进行类似操作时,基本方法是什么Delete。我想在.NET中使用任何类型的非托管资源时可能会出现这个问题,是否有一种通用的方法来解决在某个时刻锁定/释放资源而不是中继的问题Garbage Collector(这显然会让你失败不时,因为它可能需要不同的时间来发布)。我看到一些使用GC...方法来显式调用finilizer和类似的东西,但是一所大学提到最好不要使用这些方法,因为它们可能会导致不可预测的问题。

那么有什么指导方针和建议吗?

4

1 回答 1

1

您所描述的“通用方法”是IDisposableDispose()方法,最常见的是通过using. 如果这在特定示例中不起作用,则该特定示例中可能存在编码错误。该错误不会改变常用方法。

再举一个例子;尝试将其加载到内存中:

var data = File.ReadAllBytes(path);
var ms = new MemoryStream(data);
MyImage = Bitmap.FromStream(ms);
于 2013-03-11T07:27:40.373 回答