根据 Hans Passant
给出的上一个问题的答案,我了解到:
MyImage = new Bitmap(openFileDialog1.FileName);
pictureBox1.Image = (Image)MyImage;
Yes, that code puts a lock on the file. The lock is produced by a memory mapped file object that GDI+ creates to efficiently map the pixel data of the file into memory without having to allocate space in the paging file. You will not be able to delete the file as long as the image is displayed in the picture box and not disposed, the lock prevents that.
问题是当我尝试从 PictureBox
中删除以前使用过的图像时(有时)出现错误。似乎在这种确切情况下甚至可以调用:
if (MyImage != null)
{
MyImage.Dispose();
}
不保证在删除图像时(我猜这可能是任何类型的非托管资源)它会被丢弃。
所以我有两个问题 - 第一个与我当前在 PictureBox
中使用 BitMap
的问题以及由此导致的资源锁定有关。我看到这不是在 PictureBox
中显示图像的唯一方法,所以还有另一种方法不会导致此问题,并保证在我需要时随时发布图像以将其删除.
我的第二个问题 - 当我必须在 .NET 中使用非托管资源并且我需要对它们执行 Delete
等操作时,基本方法是什么。我想在 .NET 中使用任何类型的非托管资源时可能会出现这个问题,是否有一种通用的方法可以解决在特定时刻锁定/释放资源而不依赖 Garbage Collector< 的问题
(这显然会时不时地让你失望,因为它可能需要不同的时间来发布)。我看到有些人使用 GC...
方法来显式调用 finilizer
和类似的东西,但大学提到最好不要使用这些方法,因为它们可能会导致不可预测的问题.
那么有什么指导方针、建议吗?
最佳答案
您所描述的“常用方法”是IDisposable
和Dispose()
方法,最常见的是通过using
公开。如果这在特定示例中不起作用,则该特定示例中可能存在编码错误。该错误不会改变常用方法。
关于那个例子;尝试将其加载到内存中:
var data = File.ReadAllBytes(path);
var ms = new MemoryStream(data);
MyImage = Bitmap.FromStream(ms);
关于c# - 在不锁定资源的情况下使用 BitMap 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15333194/