0

システムのメモリ管理に関して問題があります。

基本的にここに私のデザインがあります:

  1. レコードのリストを読み込みます。frmBrowse 使用メモリ 90MB

  2. レコードをクリックすると、選択したレコードの詳細フォームである別のフォームがポップアップします frmAP 使用メモリ 110MB

    private void ViewRecord()
    {
        try
        {
            if(oAP!=null)
            oAP = new frmAP();
            oAP.LoadRecordDetails();
            oAP.Show();
        }
        catch (Exception ex)
        {
            clsClass.oGenMethods.ErrorMessage(ex.Message, "frmBrowse", "EditSearchFields");
        }
    }
    
  3. ユーザーが閉じると、実際に非表示にする(frmAP)ルックアップテーブルなどのデータの再クエリを防ぐ - frmAP - 使用メモリ110MB

frmAP_Close() について

this.Hide();

-110MBのメモリ

  1. フォーム ( frmSomeForm ) を非表示にした後、メモリは 110MB のままです
  2. "frmAP" が呼び出された/インスタンス化された Form(frmBrowse) をユーザーが閉じたとき

    public void tsClose_Click(オブジェクト送信者, EventArgs e) {

            if (oAP != null)
            {
                oAP .Dispose();
                oAP .Close();
                GC.Collect();
            }
    

    }

問題は、リスト (frmBrowse) フォームとレコード フォーム (frmAp) が閉じられたかどうかにかかわらず、メモリがまだ ~110MB であることです。

ご意見をお聞かせください

前もって感謝します

アップデート:

問題を特定するために .Hide() を削除しようとしましたが、それでもメモリは増え続けます

4

1 に答える 1

4

呼び出しCloseによって、オブジェクトに関連付けられたメモリが解放されることはありません。それがガベージコレクターの仕事です。Closeまたは、オブジェクトが使用している管理されていないメモリまたはリソースDisposeを解放するようにオブジェクトに指示するだけです。オブジェクトとそれが参照しているすべてのものは、引き続きメモリに残ります。

が確実oAPに収集されるようにするには、null に設定します。

oAP.Close();
oAP = null;

ただし、これは間違っている可能性があります。ガベージ コレクターの要点は、必要なときに参照されていないオブジェクトからメモリを収集することです。oAPnullに設定する必要はありませんoAP。GC が必要とするときに参照するものはすべて収集されます。

于 2013-11-12T09:18:16.530 に答える