MS-Access(2016)データベースにシッククライアントを作成しています。MS-Access - > OLEDB - > DataTable - > DataGridViewメモリリーク
私のフォームの1つは、データグリッドビューへのフォームの読み込み時にデータベースからデータを取得します。問題は、このフォームを閉じた後、メモリ使用量がアイドル状態に戻らないことです。アプリケーションは約200MBの後に、このフォームを開く前に約20MBを使用し、フォームを閉じた後、ほとんど200MBにとどまります。しかし、もし私がもう一度それを開くと、それはさらに200MBを消費するでしょう。
ブロックをほとんどどこでも使用していますが、明示的にデータテーブルをnullにしてガベージコレクタを呼び出そうとしましたが、何も役立たないです。
//This is the funcion being called on Form load event
public static DataTable oledb_rs(string command)
{
using (OleDbConnection conn = new OleDbConnection())
{
conn.ConnectionString = Connection.ConnStr();
conn.Open();
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = command;
using (OleDbDataAdapter rs = new OleDbDataAdapter(cmd))
{
using (DataTable dt = new DataTable())
{
rs.Fill(dt);
return dt;
}
}
}
}
}
//The Form load event
using (DataTable megalldt = Connection.oledb_rs("SELECT * FROM Megallapitasok"))
{
dataGridView1.DataSource = megalldt;
}
//The form close event
dataGridView1.Dispose();
this.Dispose();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.WaitForFullGCComplete();
GC.Collect();
どのようにメモリの使用量を決定していますか?これを試してください:メモリ使用量が急増するフォームを開いて閉じる、**アプリケーションを最小限に抑え**、メモリフットプリントを見てください。 –
1)フォームを閉じ、次に2)収集コードを実行すると、フォーム(データグリッド、データテーブル、データロー、データロービュー)で使用されたメモリを(ほとんどの)取得する必要があります。私は特定のプロセスで使用されているタイプのインスタンスの数を見ることができる小さなツールを書いています:https://stackoverflow.com/questions/43854093/viewing-garbage-collection-history-in-c-sharp -vs2015/44484627#44484627 –
@SimonMourier、それは、dataGridView1.Dispose();私はそれを次の行に置き換えなければなりませんでした:dataGridView1.DataSource = null; .... 2番目のフォームが閉じた後、私はGCを呼び出し、メモリ使用量は、アイドルに非常に近い値に戻ります。私はあなたに賞金を授与することができるようにこれを回答者に形成してください。ありがとうございました! – Coffeegrinder