如何从已清除并设置为null的DataTable中释放内存?

时间:2014-01-30 13:55:04

标签: c# memory-leaks datatable

我一直在编写围绕sqlite后端设计的小型数据库应用程序。作为其中的一部分,我在我的GUI中包含了一些查询功能,以便用户可以获得所需的数据。数据被加载到DataTable中,最终使它成为可停靠窗口中的datagridview。我遇到的问题是,当我关闭窗口时,DataTable中的内存不会被释放。我做了一些测试,包括运行查询,从SQLiteDataAdapter填充DataTable,在DataTable上立即运行.Clear().Dispose(),最后将DataTable设置为null。内存使用率仍然存在。我几乎肯定是DataTable,因为当我从适配器填充DataTable时,内存使用量增加了大约170mb。我如何收回记忆!? ; - )

填充数据表的方法:

internal static DataTable RawQuery(string sql)
{
    DataTable dt = new DataTable();
    SQLiteDataAdapter da = new SQLiteDataAdapter(sql, conn);
    try
    {
        da.Fill(dt);
        return dt;
    }
    catch (SQLiteException ex)
    {
        MessageBox.Show(ex.Message);
        return null;
    }
}
来自调用方法的

片段:

Thread thread = new Thread(() => {

    mainForm.Invoke(new Action(() => 
    {
        mainForm.myStatusLabel.Text = "Executing query...";
        mainForm.myProgressBar.Style = ProgressBarStyle.Marquee;
        mainForm.myProgressBar.Visible = true;
    }));

    try
    {
        Database.CreateQueryTempTable(title, query);
        dt = Database.RawQuery("SELECT * FROM " + title + ";");

        if (dt == null)
            return;

        // TEST***************
        dt.Clear();
        dt.Dispose();
        dt = null;
        //********************

        //...etc.
    }

编辑:

为了澄清一下,每次运行查询时,内存使用量都会增加(大概是在我得到一个stackoverflow之前,我还没有把它推到这么远)。分配的内存未被回收。

3 个答案:

答案 0 :(得分:0)

你没有,你不能。由GC决定如何处理该内存。

答案 1 :(得分:0)

您可以尝试使用GC.Collect()强制进行垃圾回收,但可能效果不如预期。

MSDN

答案 2 :(得分:0)

DataSet和DataTable实际上没有任何非托管资源