内存/资源未发布

时间:2016-08-19 12:49:54

标签: c# winforms datagridview

我使用两个windows forms,第一个表单将在datagridview中填充多个图像文件,在第二个表单中所有这些图像都放在另一个datagridview控件中,第二个{{ 1}}控件有一个按钮datagridview,它将删除文件。
单击按钮后,在使用文件时发生异常。但我已经处理了Delete Image并清除了它的行,但它仍然导致不释放图像。我已经尝试过调用datagridview方法,但它没有帮助。我的示例代码如下。

在第一张表格中

GC.Collect();

以及第二种形式:

// Commenting the code above
if (validuser)
{
  dgvImages.Rows.Clear();
  dgvImages.Dispose();

  GC.Collect();
  var form = new NewForm();
  form.Show();
  this.Hide();
}

编辑:以下是我加载图片的方式

private void dgvImages_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
  try
  {
    if (e.ColumnIndex == 1)
    {
      string selectedpath = dgvImages.Rows[e.RowIndex].Cells[2].Value.ToString(); // this cell contains the full path of the image
      if (File.Exists(selectedpath))
      {
        dgvImages.Rows.Clear();
        dgvImages.Dispose();

        GC.Collect();
        GC.WaitForPendingFinalizers();

        File.Delete(selectedpath); 

        LoadImages();
       }
     }
   }
   catch (Exception ex)
   {
    MessageBox.Show(ex.Message); // File is in use
   }
}

2 个答案:

答案 0 :(得分:1)

默认情况下,当您使用Image.FromFile时,它将锁定文件,直到图像被丢弃。

根据MSDN资源

https://msdn.microsoft.com/en-us/library/4sahykhd(v=vs.110).aspx

您要做的是按照此答案加载图片。

Open Image from file, then release lock?


Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
    img = new Bitmap(bmpTemp, true);
}

根据新的Bitmap文档,您可能需要使用icm。

https://msdn.microsoft.com/en-us/library/3135s427(v=vs.110).aspx

使用此构造函数打开具有以下文件格式的图像:BMP,GIF,EXIF,JPG,PNG和TIFF。

答案 1 :(得分:1)

Image.FromFile()方法通过GDI +

锁定文件

使用以下代码从流加载图像:

 public  Image GetmageFromStream(string path)
{
  using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) {
    var img = Image.FromStream(fs);
    return img;
            }
}