gpt4 book ai didi

c# - .NET PictureBox - 如何确保资源已释放

转载 作者:行者123 更新时间:2023-11-30 22:19:59 26 4
gpt4 key购买 nike

我在用户控件中有一个 OpenFileDialogPictureBox。为了更好地理解这个问题,我将用几句话解释这个用户控件是如何工作的。用户可以选择要为表单打开的图像。此图像的名称保存在数据库中,图像文件复制到默认位置。当数据库中保存了一些图像时,当加载带有图片框控件的表单时,它会加载到图片框中。如果用户选择另一个图像并想用新图像保存表单,我有一个方法可以从我的默认位置删除旧图像文件,这就是问题发生的地方。

当我加载图像并尝试保存新图像时,有时(实际上很少见)我会收到一个错误,提示 The resource is being used by another process.. 我可以粘贴确切的错误如果需要的话。我认为问题是由图片框及其处理图像的方式引起的。

这是我的代码:

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
try
{
if (MyImage != null)
{
MyImage.Dispose();

}
selectedFile = openFileDialog1.FileName;
selectedFileName = openFileDialog1.SafeFileName;

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

int imageWidth = pictureBox1.Image.Width;
int picBoxWidth = pictureBox1.Width;

if (imageWidth != 0 && picBoxWidth > imageWidth)
{
pictureBox1.Width = imageWidth;
}
else
{
pictureBox1.Width = defaultPicBoxWidth;
}
}
catch (Exception ex)
{
logger.Error(ex.ToString());
MessageBox.Show("Error loading image!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

和我的删除方法:

public void DeleteImage(AppConfig imageInfo, string imageName)
{
string imgPath = imageInfo.ConfigValue.ToString();
try
{
File.Delete(imgPath + "\\" + imageName);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}

我认为:

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

}

会处理这个问题,但有时还是会发生。而且因为它不是每次都处理它甚至更重要,因为在某些时候我可能会决定我已经解决了它但实际上只是幸运了一段时间。

最佳答案

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

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

您可以通过制作图像的内存副本来防止文件被锁定:

    using (var temp = new Bitmap(openFileDialog1.FileName)) {
pictureBox1.Image = new Bitmap(temp);
}

当然效率不高,如果图片很大就应该避免。并且请注意,另一个进程实际上可能对该文件具有类似的锁定。你对此无能为力。

关于c# - .NET PictureBox - 如何确保资源已释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15274463/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com