问题描述
最近测试程序功能时发现存在图片资源一直被占用无法释放的问题。
程序的功能大致为打开窗口时从服务器端临时下载图片到本地,然后在窗口中显示,窗口关闭时清除下载的文件。在最后关闭窗口时会报“文件XXX.jpg正由另一进程使用,因此该进程无法访问此文件”的错误。
原因分析
通过分析程序代码,最终定位到是加载图片时使用了picturebox控件的load函数加载并显示图片,最后导致窗口关闭时无法删除临时文件。
写了一个测试程序还原上述问题,主要代码如下
private string m_destFile = string.Empty;
private void btnLoad_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "JPG File|*.jpg";
if (ofd.ShowDialog() == DialogResult.OK)
{
m_destFile = System.IO.Path.Combine(Application.StartupPath, System.IO.Path.GetFileName(ofd.FileName));
System.IO.File.Copy(ofd.FileName, m_destFile);
picImage.Load(m_destFile);
}
}
private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
{
if(System.IO.File.Exists(m_destFile))
{
System.IO.File.Delete(m_destFile);
}
}
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
if(picImage.Image!=null)
{
picImage.Image.Dispose();
picImage.Image = null;
}
}
}
测试程序的运行效果如下图所示,加载并显示图片很正常,但是关闭窗口时删除本地文件就会报错,错误信息为图片文件正由另一进程使用,无法访问此文件。
解决方案
百度了一下资料,发现碰到该问题的人不少,在此截取了部分文章作为参考文献放在了本文最后,有兴趣的可以看看。
解决该问题的方式比较粗糙,就是把上述测试代码中的:
picImage.Load(m_destFile);
换成了下面的代码,程序就可以正常关闭窗口,同时能顺利删除本地的临时文件。
picImage.Image=new Bitmap(m_destFile);
参考文献中有介绍使用流方式加载图片(FileStream ),有兴趣的也可以试试。
参考文献:
[1]C# 图片资源无法释放问题,https://blog.youkuaiyun.com/banket004/article/details/17262649
[2]c#释放已经加载的图片,https://blog.youkuaiyun.com/laiyinping/article/details/39891803?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-7.control
[3]C#释放已经加载的图片,https://blog.youkuaiyun.com/weixin_30609331/article/details/95935969?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242
[4]Winform中的PictureBox读取图像文件无法释放的问题,https://www.cnblogs.com/chas/p/3760472.html