2016-08-19 94 views
2

我使用两个windows forms,第一种形式将具有填充在datagridview,所述第二形式的所有这些图像被放置在另一datagridview器上的多个图像文件,所述第二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 
    } 
} 

编辑:这里是我如何加载图像

private void LoadImages() 
{ 

if (Directory.Exists(path)) 
{ 
    DirectoryInfo dir = new DirectoryInfo(path); 
    FileInfo[] files = dir.GetFiles(); 

    foreach (var f in files) 
    { 
    if (f.Extension.ToLower() == ".jpg" || f.Extension.ToLower() == ".png" || f.Extension.ToLower() == ".bmp" || f.Extension.ToLower() == ".tiff") 
    { 
     dgvImages.Rows.Add((Image.FromFile(f.FullName)), "Delete Image" ,f.FullName); 
    } 
    } 
    } 
} 
+0

你好*装载*图像并入电网? –

+0

让我在帖子中加入我的'LoadImages();'方法! – CodeIt

+0

dgvImages.Rows.Clear()和dgvImages.Dispose()都不会调用您使用的任何图像的Dispose()方法。 DGV不可能知道图像是否可能在其他地方使用,因此无法安全地做到这一点。你必须自己照顾这个。 GC.Collect()本身也不够好,你还必须调用GC.WaitForPendingFinalizers()。如果仍然没有释放锁,那么你正在其他地方使用图像。 –

回答

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); 
} 

根据您可能需要得到它使用ICM新的位图文件。

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

使用此构造与下列文件格式打开图片:BMP,GIF,EXIF,JPG,PNG和TIFF。

+0

我真的很感谢答案,但它在Program.cs类中引起了一个参数异常。它说该参数无效。 – CodeIt

+0

尝试新的位图(“file_location”,true); 这将得到位图使用icm根据文档在这里。 https://msdn.microsoft.com/zh-cn/library/3135s427(v=vs.110).aspx 根据备注,使用此构造函数可以使用以下文件格式打开图像:BMP,GIF, EXIF,JPG,PNG和TIFF。 –

+0

这是最好的答案,我从来不知道'Image.FromFile'对图像施加锁定。非常感谢!! – CodeIt

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; 
      } 
}