MS-Access - > OLEDB - > DataTable - > DataGridView内存泄漏

时间:2017-06-15 08:45:06

标签: c# ms-access oledb

我正在为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();

1 个答案:

答案 0 :(得分:0)

DataGridView.Dispose()对数据源(及其底层数据)做了很多工作,它更专注于处理图形(GDI +)对象,可视列,单元格,笔,画笔等但它有一个参考。

因此,减少内存所需要的是确保没有任何内容可以保存对DataTable(您创建的实例)的引用。有很多方法可以做,它取决于你的对象是如何创建的,什么实例引用什么,它们如何超出范围等等。

最简单的解决方案是关闭第二个表单,然后,dataGridView1将不再被引用(它被第二个表单引用),对于它的DataSource实例也是如此。然后,您可以运行GC收集代码。