我開發了一個使用C#,Winforms和Mysql的銷售點系統。部署之後,我發現內存大小隨着時間的推移而不斷增加。在評估我的代碼後,我覺得我的數據層可能是罪魁禍首。我使用類似這樣的方法進行數據庫通用調用我的應用程序佔用的內存不斷增加
public static DataTable ExecQuery(string query, List<SqlParam> sp_params, string db)
{
MySqlConnection sCon = new MySqlConnection();
sCon.ConnectionString = "server=" + server + ";port=" + port + ";database=" + db + ";uid=" + user + ";pwd=" + password + ";charset=utf8;";
MySqlCommand command = new MySqlCommand();
command.CommandType = CommandType.Text;
command.Connection = sCon;
if (sp_params != null)
{
for (int i = 0; i < sp_params.Count; i++)
{
MySqlParameter sparam = new MySqlParameter();
sparam.ParameterName = sp_params[i].Name;
sparam.MySqlDbType = sp_params[i].Type;
sparam.Value = sp_params[i].Value;
command.Parameters.Add(sparam);
}
}
command.CommandText = query;
sCon.Open();
MySqlDataReader sd = command.ExecuteReader();
DataTable dt = new DataTable();
for (int fc = 0; fc < sd.FieldCount; fc++)
{
if (dt.Columns.Contains(sd.GetName(fc)))
{
dt.Columns.Add(sd.GetName(fc) + "1", sd.GetFieldType(fc));
}
else
{
dt.Columns.Add(sd.GetName(fc), sd.GetFieldType(fc));
}
}
while (sd.Read())
{
DataRow dr = dt.NewRow();
for (int fc = 0; fc < sd.FieldCount; fc++)
{
dr[fc] = sd.GetValue(fc);
}
dt.Rows.Add(dr);
}
sCon.Close();
return dt;
}
對於每個數據庫調用,我們都使用這種方法。前端只需指定參數和查詢。我懷疑這種靜態方法會導致內存問題嗎?
更新:
剛剛發現我的應用程序的另一個泄漏:
無論是的ReportViewer使用,LocalReport.ReleaseSandboxAppDomain()必須將主窗體的FormClosing事件被調用。否則,每次調用Report,都會增加內存大小。
更新2
找到內存泄漏的真正原因在我的系統。我正在使用一個複雜的用戶控件,我將它添加到一個flowlayoutpanel中。
我正在使用正常的foreach循環來處理每個控件..但不知何故只有一半的對象被處置。我將這個foreach循環嵌套在for循環中,並將counter作爲控件的數量。
int count = flwControls.Controls.Count;
for (int i = 0; i < count; i++)
{
foreach (Control c in flwControls.Controls)
{
c.Dispose();
}
}
內存泄漏.... – 2014-09-13 13:32:36
@JoeDF是導致泄漏的方法的靜態'性'?或代碼 – 2014-09-13 13:39:08
功能的任何特定部分看起來OK(除了缺少任何異常處理或使用/ finally語句來強制資源的釋放)。是否有可能你分配和返回的表('DataTable dt = new DataTable();')永遠不會被釋放? – 2014-09-13 13:42:17