2016-07-28 13 views
0

私のアプリケーションでは、DataBindingを使用してDataGridにバインドされたICollectionViewの製品を使用します。製品はMS-SQLテーブルから来ており、このテーブルは静かで大きなものです(〜30.000エントリ)。ある時点で、内容が変更されている可能性があるため、テーブルをリロードする必要があります。Entity FrameworkでICollectionViewを使用する場合のメモリリーク

ReloadProducts()〜30.000を呼び出すたびに、新しいオブジェクトが作成されます。以前のオブジェクトは解放されず、アプリケーションのライブ全体でメモリに残ります。

どのように古いオブジェクトの処分を強制することができますか?

のViewModel:

private ICollectionView _productCollectionView; 

public ICollectionView ProductCollectionView 
{ 
    set { _productCollectionView = value; } 
    get 
    { 
     if (_productCollectionView == null) 
     { 
      ReloadProducts(); 
     } 
     return _productCollectionView ; 
    } 
} 

public void ReloadProducts() 
{ 
    List<Products> productList = Entities.Products.ToList(); 
    ProductCollectionView = CollectionViewSource.GetDefaultView(productList); 
    NotifyPropertyChanged("ProductCollectionView"); 
} 

ビュー:

<DataGrid ItemsSource="{Binding ProductCollectionView}" AutoGenerateColumns="False"/> 
+0

ただ、このようなものを使うのか? – tym32167

+0

この質問のコードを書式設定するときにその行を忘れてしまった。私は私のポストにそれを加えました。 – AlexanderW

+0

どのようにメモリリークがあると判断しますか?メモリプロファイラを使用していますか?あなたはGC.Collect()を手動で呼びますか?なぜあなたはこの場所で正確に漏れていると思いますか? – tym32167

答えて

1

コレクションを使用してみてくださいませんどちらも、それはビューです。バインディングは、コレクション自体のビューに接続します。あなたはProductCollectionViewの変化についての見解を通知している

private ObservableCollection<Products> _productCollectionView; 

    public ObservableCollection<Products> ProductCollectionView 
    { 
     set { _productCollectionView = value; } 
     get 
     { 
      if (_productCollectionView == null) 
      { 
       ReloadProducts(); 
      } 
      return _productCollectionView ; 
     } 
    } 

    public void ReloadProducts() 
    { 
     ProductCollectionView.Clear(); 
     ObservableCollection<Products> ProductCollectionView = 
new ObservableCollection<Products>(Entities.Products.ToList()); 
    } 
+0

あなたの返事をありがとう。これはおそらく動作します。しかし、私はそれにフィルタを適用する必要があるので、私はICollectionViewを使用することを余儀なくされています。 – AlexanderW

+0

try: 'public void ReloadProducts() { ProductCollectionView.Clear(); ProductCollectionView = new CollectionViewSource(); ProductCollectionView.Source = Entities.Products.ToList(); } – Shakra

関連する問題