2017-06-15 8 views
1

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(); 
+0

どのようにメモリの使用量を決定していますか?これを試してください:メモリ使用量が急増するフォームを開いて閉じる、**アプリケーションを最小限に抑え**、メモリフットプリントを見てください。 –

+0

1)フォームを閉じ、次に2)収集コードを実行すると、フォーム(データグリッド、データテーブル、データロー、データロービュー)で使用されたメモリを(ほとんどの)取得する必要があります。私は特定のプロセスで使用されているタイプのインスタンスの数を見ることができる小さなツールを書いています:https://stackoverflow.com/questions/43854093/viewing-garbage-collection-history-in-c-sharp -vs2015/44484627#44484627 –

+0

@SimonMourier、それは、dataGridView1.Dispose();私はそれを次の行に置き換えなければなりませんでした:dataGridView1.DataSource = null; .... 2番目のフォームが閉じた後、私はGCを呼び出し、メモリ使用量は、アイドルに非常に近い値に戻ります。私はあなたに賞金を授与することができるようにこれを回答者に形成してください。ありがとうございました! – Coffeegrinder

答えて

0

DataGridView.Disposeは()データソース(およびその基礎となるデータ)について多くをしない、それはなどしかし、グラフィカル(GDI +)のオブジェクト、視覚的な列、セル、ペン、ブラシを、処分により集中ですそれには参照があります。

したがって、メモリを減らすためには、DataTable(作成したインスタンス)への参照が何も保持されないようにする必要があります。オブジェクトを作成する方法、インスタンスの参照先、範囲の外に出る方法などによって異なります。

最も簡単な解決策は、2番目のフォームを閉じることです。その後、dataGridView1はもはや参照されます(2番目の形式で参照されています)。DataSourceインスタンスも同じです。次に、GCコレクションコードを実行できます。

関連する問題