文件.位图上的删除不起作用,因为文件正在被另一个进程使用(我使用了bitmap. dispose();)

本文关键字:文件 dispose bitmap 进程 删除 位图 不起作用 因为 另一个 | 更新日期: 2023-09-27 18:04:18

我正在用c#创建一个Windows窗体应用程序。

我在表单上有一些按钮,我使用BackgroundImage属性在它们上设置位图图像

我想动态地改变这些图像,所以:

  1. 我使用using (bitmap = new Bitmap...)并保存一个新的位图图片。

  2. 我指定新的位图在按钮上

  3. 然后,我尝试通过调用Dispose()System.IO.File.Delete(nameToDelete)来删除旧的位图;

问题:File.Delete函数抛出一个异常:"文件正在被另一个进程使用"我不能删除它。

我还尝试调用GC.Collect()并将位图分配给null,但它不起作用。

我发现唯一的"解决方案"是在删除之前调用Thread.Sleep(2),但这是一个补丁,每次都不起作用。

下面是代码(layerPics[z]是一个保存所有位图的数组,每个按钮一个):

string name = "new name";
Bitmap bitmap;
using (bitmap = new Bitmap(x, y))
{
    Form.DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));
    bitmap.Save(name);
    button.BackgroundImageLayout = ImageLayout.Stretch;
    button.BackgroundImage = Image.FromFile(name);
}
layerPics[z].Dispose();
layerPics[z] = null;
layerPics[z] = bitmap;

我能做什么?谢谢!

文件.位图上的删除不起作用,因为文件正在被另一个进程使用(我使用了bitmap. dispose();)

引起问题的不是Bitmap,而是这一行:

Buttons.BackgroundImage = Image.FromFile(name);

这里,您使用工厂方法FromFile()创建Image类的实例。在Image被释放之前,该文件一直处于锁定状态。