2017-01-03 14 views
1

私はC#、.Net 4.6.x、Visual Studio 2017 RCのWinFormsのTelerikコントロールを使用しています。このアプリケーションは、RadRibbonとRadPageViewを使用する「メイン」ウィンドウで構成されています。 RadPageViewは、最初のページである検索フォームまたは新しい空白のフォームを要求するユーザーに基づいてページを動的に取り込みます。他のページはRadPageViewPageから継承され、 "TQC"という追加のプロパティがあります。 TQCは、ページにロードされるカスタムコントロールを指します。OutOfMemoryExceptionを解決する最良の方法は? (C#)

TQCには、TQCオブジェクト内のRadPageViewコントロールにすべて含まれるRadPageViewPagesのドロップダウンリストとテキスト領域がいくつかあります。 RPVP(RadPageViewPageを継承するクラス)がSelectedになるまで、コントロールにデータをバインドしません。ドロップダウンリストの1つに、投入されると200件程度のエントリが含まれます(アカウントのリスト)。

私が遭遇した問題は、外側のRadPageView Remove()が1ページのときに、そのページが占めるメモリが数百メガバイトのオーダーに解放されていないことです。ターゲットマシンのRAMが4GB〜8GBのため、問題があります。私は、終了イベントの一部としてnullにコントロールを移入するデータオブジェクトを設定しようとしましたが、何も変更されませんでした。 、および5つの以上のタブが偶数(ユーザーが表示されている場合、私はまだ狂った巨大なメモリリークを取得しています

private void rpvQtabs_PageRemoved(object sender, RadPageViewEventArgs e) 
    { 

     foreach (TQC c in e.Page.Controls) 
     {     
      foreach (Control ca in c.Controls) 
      { 
       foreach (Control cac in ca.Controls) 
       { 
        cac.Dispose(); 
       } 
       ca.Dispose(); 
      } 
      c.Dispose(); 
     } 
     e.Page.Dispose();   
    } 

:私はまた、明示的に以下のようにRadPageViewPageのすべての子孫でのDispose()メソッドを呼び出してみました彼らがページを閉じると)、すぐにOutOfMemoryExceptionが発生します。私はパフォーマンスプロファイラを付けてみましたが、試行でクラッシュしました。 VS 2015は現在のところオプションではありません。ページが適切に配置されていることを確認するにはどうすればよいでしょうか、非常に大きなドロップダウンリストのメモリフットプリントを減らすにはどうすればよいですか?これはTelerikを使用するための最初の試みです。コメント欄での質問に対応して

:エラーがスローされます

オブジェクトは通常、比較的ランダムであり、ロードされたアカウントによって異なります。無限に再帰的なものではありません。これは、コントロールのは、もともと(特別な接続クラスを使用して)ロードする方法である。さらに調査した後

public static List<Account> List(bool includeDefaults = true) 
    { 
     //search 
     var rs = new List<Account>(); 
     string q = "select distinct r.ID, r.name from db.addressbook r"; 
     DataTable dt = new DataTable(); 
     using (var cmd = new CustomConnectionClass()) 
     { 
      cmd.Safety.Off(); 
      dt = cmd.ExecuteDirectQuery(q); 
     } 

     foreach (DataRow r in dt.Rows) 
     { 
      var a = new Account(); 
      a.ID = long.Parse(r[0].ToString()); 
      a.Name = r[1].ToString(); 
      rs.Add(a); 
     } 
     rs = rs.OrderBy(t => t.ID).ToList(); 
     var n = new Account(); 
     n.ID = 0; 
     n.Name = "Generic Account"; 
     var o = new Account(); 
     o.ID = 999999; 
     o.Name = n.Name; 
     rs.InsertRange(0, new Account[] { n, o }); 
     return rs; 

    } 
+0

DropDownListにはいくつのアイテムがありますか?アイテムは何ですか?複合オブジェクトまたは単にid +値ですか? –

+0

IEnumerable にバインドされています。これには16個のプロパティが含まれていますが、そのほとんどはリストを生成するときにロードされません。入力された唯一の2つは、実際にはID番号と名前です。これは連結されて、ToString()メソッドを介してドロップダウンに表示テキストを作成します。 IEnumerableは、アプリケーションがメインフォームの一部として読み込まれたときに実際に作成されますが、これらのコントロールにバインドする子オブジェクトによってアクセスされます。 – CDove

+0

私はちょうど100000行のDatatableを持つDropDownListをロードしています。問題はありません。Datatableには9つの列がすべて設定されています。したがって、200Entry * 16プロパティは問題ではありません。 –

答えて

0

、私はこれはTelerikは、そのテーマとコントロールをロードする方法を必要とすることを整理することができました。ドロップダウンリストのすべてのデータソースをstaticにするとフットプリントは少し小さくなりましたが、各タブ内のコントロールのテーママネージャとテーマは毎回新しいものとして読み込まれました。設計上、制御装置を閉じて配置するときに必ずしも配置される必要はない。ユーザーのメモリ不足を防ぐために、UIのデザインを再作成する必要があります。標準のWinFormsを使用して同じデザインを組み込むと、問題はなくなります。

+0

これについてtelerikに報告するバグを報告する必要があります。次回のライセンスで素晴らしい割引を受けることができます。 –

関連する問題