C# MS访问->;OLEDB->;数据表->;DataGridView内存泄漏
我正在为MS Access(2016)数据库编写一个厚客户端 我的一个表单在表单加载到datagridview时从数据库检索数据。问题是,关闭此表单后,内存使用率不会下降到空闲状态。在打开此表单之前,应用程序使用了大约20mb的内存,打开之后大约是200mb,关闭表单之后几乎保持在200mb。但如果我再次打开它,它将消耗额外的200mb 我几乎在任何地方都使用block,尝试显式地将datatable置零,调用垃圾收集器,但没有任何帮助C# MS访问->;OLEDB->;数据表->;DataGridView内存泄漏,c#,ms-access,oledb,C#,Ms Access,Oledb,我正在为MS Access(2016)数据库编写一个厚客户端 我的一个表单在表单加载到datagridview时从数据库检索数据。问题是,关闭此表单后,内存使用率不会下降到空闲状态。在打开此表单之前,应用程序使用了大约20mb的内存,打开之后大约是200mb,关闭表单之后几乎保持在200mb。但如果我再次打开它,它将消耗额外的200mb 我几乎在任何地方都使用block,尝试显式地将datatable置零,调用垃圾收集器,但没有任何帮助 //This is the funcion being c
//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();
DataGridView.Dispose()对数据源(及其底层数据)没有太多作用,它更关注于处理图形(GDI+)对象、可视列、单元格、画笔、画笔等,但它有一个引用
因此,您需要减少内存,以确保不再有任何内容包含对DataTable(您创建的实例)的引用。有很多方法可以做到这一点,这取决于对象是如何创建的,什么实例引用了什么,它们是如何超出范围的,等等
最简单的解决方案是关闭第二个表单,然后dataGridView1将不再被引用(它被第二个表单引用),其DataSource实例也是如此。然后可以运行GC收集代码。DataGridView.Dispose()对数据源(及其底层数据)没有太大作用,它更侧重于处理图形(GDI+)对象、可视列、单元格、笔、画笔等,但它有一个参考
因此,您需要减少内存,以确保不再有任何内容包含对DataTable(您创建的实例)的引用。有很多方法可以做到这一点,这取决于对象是如何创建的,什么实例引用了什么,它们是如何超出范围的,等等
最简单的解决方案是关闭第二个表单,然后dataGridView1将不再被引用(它被第二个表单引用),其DataSource实例也是如此。然后您可以运行GC收集代码。您如何确定使用的内存量?请尝试以下操作:打开造成内存使用高峰的窗体,关闭它,最小化应用程序并查看内存占用。如果1)关闭窗体,然后2)运行收集代码,则应获取(大部分)窗体中使用的内存(datagrid、datatable、datarows、DataRowView)。我已经编写了一个小工具,可以让您观察特定流程中使用了多少类型的实例:@SimonMourier,事实证明,dataGridView1.Dispose();如果没有按预期处理所有内容,我必须用以下行替换它:dataGridView1.DataSource=null。。。。现在,在第二个表单关闭后,我调用GC,内存使用率下降,非常接近空闲。请把这张表格交给Answare,这样我就可以把赏金给你了。非常感谢。您如何确定使用的内存量?请尝试以下操作:打开造成内存使用高峰的窗体,关闭它,最小化应用程序并查看内存占用。如果1)关闭窗体,然后2)运行收集代码,则应获取(大部分)窗体中使用的内存(datagrid、datatable、datarows、DataRowView)。我已经编写了一个小工具,可以让您观察特定流程中使用了多少类型的实例:@SimonMourier,事实证明,dataGridView1.Dispose();如果没有按预期处理所有内容,我必须用以下行替换它:dataGridView1.DataSource=null。。。。现在,在第二个表单关闭后,我调用GC,内存使用率下降,非常接近空闲。请把这张表格交给Answare,这样我就可以把赏金给你了。非常感谢。