我正在用C#创建一个Windows窗体应用程序。
我在表单上有一些按钮,我使用BackgroundImage
属性在它们上设置位图图像。
我想动态地改变这些图像:
我使用了using (bitmap = new Bitmap...)
并保存了一个新的位图图片。
我将新位图指定为按钮。
然后,我尝试通过调用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;
我该怎么办? 谢谢!
答案 0 :(得分:4)
导致问题的不是Bitmap
,而是这一行:
Buttons.BackgroundImage = Image.FromFile(name);
在这里,您使用工厂方法Image
创建FromFile()
类的实例。在Image
被处理之前,文件将保持锁定状态。