我從數據庫中讀取到我的Datagridview
約25000條記錄。 在此閱讀,應用是在「沒有響應」的模式,我可以看到它的進程內存越來越大,並停止圍繞2500-3800 MB。 後,我關閉包含Datagridview
形式,內存保持在這個規模。如何減少和如何清除內存泄漏?
我的問題是:
- 如何避免「沒有響應」當我讀了巨大的數據量?
- 如何減少我從數據庫中讀取時正在使用的內存量(我認爲我做錯了什麼,因爲它有很多內存)
- 如何清除I後的所有內存關閉表格?我正在處理所有我能做的事情,但似乎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內存泄漏,我的數據庫是約5萬條記錄(我沒有注意到,因爲我有被灌我的數據庫的腳本,我忘了停下來)
現在內存泄漏是比較可以接受的,這是大約10 MB超過它以前我添加記錄到DataGridView。 不過。即使當我使用虛擬模式,並試圖關閉/處置盡我所能,每個填充內存生長在大約10 MB。
你在TaskManager中看到的與GC沒有直接關係(做或不做)。除了在GUI中加載25k記錄不明智之外,這裏沒有直接指示問題。 –
25K是可能的最大數量,它應該在2K左右,但我想讓應用程序達到極限並尋找錯誤。 那麼爲什麼當我用'Datagridview'關閉winform時,計算機沒有清除內存? – Itay
你需要同時顯示所有這些行嗎?您的DataGridView是否處於虛擬模式?你的記憶問題何時出現?從數據庫加載或設置DataGridView的DataSource時? –