c# - 在不锁定资源的情况下使用 BitMap 对象

标签 c# .net dispose unmanagedresources

根据 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 和类似的东西,但大学提到最好不要使用这些方法,因为它们可能会导致不可预测的问题.

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

最佳答案

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

关于那个例子;尝试将其加载到内存中:

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

关于c# - 在不锁定资源的情况下使用 BitMap 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15333194/

相关文章:

c# - 跳过潜在的空值 c#

c# - 如何在 DataGridViewCell 中托管控件以进行显示和编辑?

.net - 从网络流中读取 : packet fragmentation

c# - 在窗体关闭 c# 上处理所有资源

c# - 何时调用 File.Dispose()

c# - Selenium Chrome 60 Headless 处理基于 HTTPS 的基本身份验证 SAML 对话框

c# - 如何隐藏 DataGridView 的网格线?窗体 C#

.net - 有没有一种方法可以声明 Property/DependencyProperty 在绑定(bind)时默认使用 TwoWay 绑定(bind)?

c# - 您是否需要处理对象并将它们设置为空?

c# - 如何摆脱 .net core 2.2 中的 CORS?