我正在为MS-Access(2016)数据库编写一个胖客户端。
我的一个表单在表单加载到datagridview时从数据库中检索数据。问题是在关闭此表单后,内存使用量不会回退到空闲状态。在打开此表之前,应用程序使用大约20mb,大约200mb后,关闭表单后几乎保持在200mb。但如果我再次打开它将消耗额外的200mb。
我几乎到处都在使用块,尝试显式地使数据表无效,调用垃圾收集器,但没有任何帮助。
//This is the funcion being called on Form load event
public static DataTable oledb_rs(string command)
{
using (OleDbConnection conn = new OleDbConnection())
{
conn.ConnectionString = Connection.ConnStr();
conn.Open();
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = command;
using (OleDbDataAdapter rs = new OleDbDataAdapter(cmd))
{
using (DataTable dt = new DataTable())
{
rs.Fill(dt);
return dt;
}
}
}
}
}
//The Form load event
using (DataTable megalldt = Connection.oledb_rs("SELECT * FROM Megallapitasok"))
{
dataGridView1.DataSource = megalldt;
}
//The form close event
dataGridView1.Dispose();
this.Dispose();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.WaitForFullGCComplete();
GC.Collect();
答案 0 :(得分:0)
DataGridView.Dispose()对数据源(及其底层数据)做了很多工作,它更专注于处理图形(GDI +)对象,可视列,单元格,笔,画笔等但它有一个参考。
因此,减少内存所需要的是确保没有任何内容可以保存对DataTable(您创建的实例)的引用。有很多方法可以做,它取决于你的对象是如何创建的,什么实例引用什么,它们如何超出范围等等。
最简单的解决方案是关闭第二个表单,然后,dataGridView1将不再被引用(它被第二个表单引用),对于它的DataSource实例也是如此。然后,您可以运行GC收集代码。