Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MS访问->;OLEDB->;数据表->;DataGridView内存泄漏_C#_Ms Access_Oledb - Fatal编程技术网

C# MS访问->;OLEDB->;数据表->;DataGridView内存泄漏

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

我正在为MS Access(2016)数据库编写一个厚客户端

我的一个表单在表单加载到datagridview时从数据库检索数据。问题是,关闭此表单后,内存使用率不会下降到空闲状态。在打开此表单之前,应用程序使用了大约20mb的内存,打开之后大约是200mb,关闭表单之后几乎保持在200mb。但如果我再次打开它,它将消耗额外的200mb

我几乎在任何地方都使用block,尝试显式地将datatable置零,调用垃圾收集器,但没有任何帮助

//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,这样我就可以把赏金给你了。非常感谢。