我正在从数据库中读取Datagridview
大约 25000 条记录。在此阅读过程中,应用程序处于“无响应”模式,我可以看到它的进程内存越来越大,并停止在 2500-3800 MB 左右。在我关闭包含 的表单后Datagridview
,内存保持在这个大小。
我的问题是:
- 读取大量数据时如何避免“无响应”?
- 当我从数据库中读取数据时,如何减少使用的内存量(我认为我做错了什么,因为它有很多内存)
- 关闭表单后如何清除所有内存?我正在尽我所能处理一切,但似乎 GC 仍然没有释放内存。我读到一些关于未处理的事件处理程序的内容?
从数据库读取到的代码Datagridview
:
delegate void SetSearchCallback();
public void Search()
{
sqlCommand="";
if (this._dbReports.InvokeRequired)
{
SetSearchCallback d = new SetSearchCallback(Search);
this.Invoke(d, new object[] { });
}
else
{
DateTime startDate = new DateTime(dateTimePicker1.Value.Year, dateTimePicker1.Value.Month, dateTimePicker1.Value.Day);
DateTime endDate = new DateTime(dateTimePicker2.Value.Year, dateTimePicker2.Value.Month, dateTimePicker2.Value.Day);
sqlCommand = "select * FROM cstPackages where _dateTime >= '" + String.Format("{0:yyyy-MM-dd}", startDate) + "' and _dateTime <='" + String.Format("{0:yyyy-MM-dd} 23:59:59.999", endDate) + "' order by _dateTime desc"; //reading the db from end to start
}
if (sqlCommand != "")
{
using (SqlConnection sCon2 = new SqlConnection("Data Source=" + SettingsForm.getAddress + ";Initial Catalog=" + SettingsForm.getDatabase + ";Integrated Security=False;User Id=" + SettingsForm.getUser + ";Password=" + SettingsForm.getPassword + ";Connect Timeout=5;"))
{
try
{
sCon2.Open();
using (da = new SqlDataAdapter(sqlCommand, sCon2))
{
dsReport.Clear();
da.Fill(dsReport, "cstPackages");
dbBind = new BindingSource(dsReport, "cstPackages");
if (firstTime == 0)
_dbReports.Columns.Clear();
_dbReports.DataSource = dbBind;
if (firstTime == 0)
{
updateDataGridSettings();
firstTime = 1;
}
_dbReports.Refresh();
sCon2.Close();
sCon2.Dispose();
}
}
catch (Exception c)
{
fn.errorHandler(c.Message, SettingsForm);
}
}
}
}
}
当我关闭表格时:(btnPress=1
仅当我填写了Datagridview
一些东西时)
private void Reports_FormClosing(object sender, FormClosingEventArgs e)
{
_dbReports.Dispose();
if (btnPress == 1)
{
dsReport.Dispose();
da.Dispose();
dbBind.Dispose();
}
}
在表格关闭后的父表格中,我打电话给ReportForm.Dispose();
我知道这Dispose
不会清除内存,但它应该有助于 GC 完成它的工作,对吧?
昨晚我让应用程序打开了一夜(关闭后ReportForm
),早上的内存是一样的(GC没有工作)
先谢谢了。
编辑: 当我得到 3GB 内存泄漏时,我的数据库有大约 500 万条记录(我没有注意到,因为我有一个脚本正在填充我的数据库,我忘了停止它)
现在内存泄漏更容易接受了,它比我将记录添加到 DataGridView 之前大约多 10 MB。仍然..即使我使用虚拟模式并尝试关闭/处置所有可能的东西,每次填充内存都会增长约 10 MB。