我使用两个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);
}
}
}
}
你好*装载*图像并入电网? –
让我在帖子中加入我的'LoadImages();'方法! – CodeIt
dgvImages.Rows.Clear()和dgvImages.Dispose()都不会调用您使用的任何图像的Dispose()方法。 DGV不可能知道图像是否可能在其他地方使用,因此无法安全地做到这一点。你必须自己照顾这个。 GC.Collect()本身也不够好,你还必须调用GC.WaitForPendingFinalizers()。如果仍然没有释放锁,那么你正在其他地方使用图像。 –