0

複数の UserControls(Insteda of Pages) を含む単純な WPF テスト プロジェクトを作成しています。Switcher クラスを使用して、異なる UserControls 間を移動しています。異なるページに移動すると、UserControle Navigation ごとにメモリ消費が増加し続け、GC が呼び出されません。

    1.So am i doing something wrong in following code? 
    2.Which part of the code consuming more memory? 
    3.Do i need to invoke GC for disposing my UserControls on each new UserControle creation? 
      If need how can i invoke GC?


public void On_Navigate_Click()
    {
        UserControle newusercontrole=new UserControle();
        DataSet ds = new DataSet();
        ds=con.getSome_Datafrom_SQL();//Gets data from SQL via connection class
        dataGrid_test.ItemsSource = ds.Tables[0].DefaultView;

        Grid.SetColumn(newusercontrole, 1);//dataGrid_test is inside newusercontrole and following is the code to add "this"  usercontrol to the main window.
        Grid.SetRow(newusercontrole, 1);
        Grid.SetZIndex(newusercontrole, 10);
        Container.Children.Add(newusercontrole);
    }
4

1 に答える 1

1

最初に、ガベージ コレクションが実際に行われていない場合 (あなたが言ったように)、それはあなたのせいではなく、何か間違ったことをしているわけではないことを指摘しなければなりませんこれは、CLR が、システムがまだメモリ不足に陥っているとは考えていないことを意味するだけです。

とにかく手動でガベージ コレクション サイクルを呼び出すには、GC.Collect()静的メソッドを使用できます。ガベージ コレクションが実際に開始され、メモリ消費量がまだ不当に高い場合は、おそらく何か間違ったことをしている可能性があります。不要なオブジェクト参照の数が増え続けており、ガベージ コレクタはそれらのオブジェクトを安全に収集できません。これは一種のメモリ リークです。

あなたのコードに関する限り、問題はあなたが投稿したメソッドの最後にあると思います:

Container.Children.Add(newusercontrole);

これは、コレクションに(クリックごとに)新しいオブジェクトを追加するようですContainer.Children。これが他の場所で削除されていない場合、これがメモリ リークの原因である可能性があります。ユースケースに適したソリューションが何であるかはわかりませんが(UIがどのように動作するか正確にはわからないため)、最後UserControleに追加されたContainer.Children. LINQ を使用できる場合は、メソッドOfType<T>()とメソッドLast()を使用して見つけることができます。

GC.Collect()いずれにせよ、この行を本番コードに残さないでください。この例のように、テスト目的で収集サイクルを強制する場合にのみ使用してください。

于 2013-08-05T06:44:26.227 に答える