我一直在编写围绕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之前,我还没有把它推到这么远)。分配的内存未被回收。
答案 0 :(得分:0)
你没有,你不能。由GC决定如何处理该内存。
答案 1 :(得分:0)
您可以尝试使用GC.Collect()
强制进行垃圾回收,但可能效果不如预期。
答案 2 :(得分:0)
DataSet和DataTable实际上没有任何非托管资源