C#Winform中picturebox控件加载图片后无法释放

问题描述

  最近测试程序功能时发现存在图片资源一直被占用无法释放的问题。
  程序的功能大致为打开窗口时从服务器端临时下载图片到本地,然后在窗口中显示,窗口关闭时清除下载的文件。在最后关闭窗口时会报“文件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.csdn.net/banket004/article/details/17262649
[2]c#释放已经加载的图片,https://blog.csdn.net/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.csdn.net/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

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页