2011-11-30 65 views
1

我有一個使用MVVM方法的WPF應用程序。時間增加,更新每個刷新私人Observable集合

在我的一個視圖模型中,我有一個私有的可觀察集合,我將其設置爲一個'new observableCollection',它是通過使用NHibernate的ISession對象通過存儲庫類獲取數據的查詢創建的。

我在我的viewmodel中有一個私有的可觀察集合,我想用我的查詢返回/創建的集合進行更新。

問題是,每次我調用我的方法來執行查詢時,每次更新私有對象(ObservableCollection)所用的時間會較長。

我測試了查詢在存儲庫中執行所花費的時間以及它僅有的4秒或5秒。我正在使用延遲加載檢索4500條記錄。

所以我的問題是,爲什麼每次我在viewmodel中調用我的刷新方法時,時間會增加?此外,我還應該補充說明,在任務管理器中顯示的內存使用情況也增加了,所以它幾乎看起來有內存泄漏?

代碼下面的例子:

視圖模型:

private static ObservableCollection<CustomerViewModel> _allCustomers;  
Expression<Func<Customer, bool>> expression2 = p => p.IsVisible == 'T'; 

_allCustomers = new ObservableCollection<CustomerViewModel>(
    from customer in ManyEntitiesRepository<Customer>.Instance.RetrieveAll(expression2) 
    select new CustomerViewModel(customer)); 

庫檢索

public virtual IList<T> RetrieveAll(Expression<Func<T, bool>> expression) 
    { 
     try 
     { 
      if (_allEntities != null) 
      { 
       foreach (T entity in _allEntities) 
        SessionProvider.Instance.GlobalSession.Evict(entity); 
       _allEntities.Clear(); 
      } 

      _allEntities = (from c in SessionProvider.Instance.GlobalSession.Query<T>().AsExpandable() 
          where expression.Invoke(c) 
          select c).ToList<T>(); 

      return _allEntities; 
     } 
+0

什麼是'SessionProvider.Instance.GlobalSession.Evict(實體); '? – sll

+0

'SessionProvider'是我的SessionProvider類的名稱,它爲應用程序的生命創建1個會話,它的私有設置使得它是一個單例,這是'實例'。全局會話是由NHibernate提供的一個'ISession'對象,用於跟蹤生活在應用程序當前範圍內的所有對象/實體。所以,當我調用上面的RetrieveAll函數時,我傳遞了我想查詢的對象類型,在這種情況下,它是一個'Customer'類類型。在「客戶」完成全面檢索之前,我們需要驅逐(擺脫)全球會話 – Kev

+0

中的當前客戶。如果我們沒有執行驅逐,那麼我們會將客戶數量增加一倍已存在的客戶實體存在於globalSession – Kev

回答

0

要解決這個我在循環中的ViewModels我的私人收藏,並呼籲各清理()...增加額外的4秒左右的刷新,但嘿,它比你的內存堵塞重複viewmodels和查詢時間增加20秒或更多,每次刷新更好。

    foreach (XViewModel m in _xCollection) 
        { 
         m.Cleanup(); 

        } 

我會留意在未來數月該工具包發佈的V.4 ...

乾杯

0

確定,所以如之前所提到的,分別的ViewModels大小加倍。 當應用程序第一次加載時,它從數據庫中加載了4689條記錄。 每次刷新完成後,都會從數據庫中檢索一組新的數據,還有另一個4689已加載等等......等等。這在內存泄漏方面非常大。

發生這種情況的原因是我在viewmodel中註冊了2條消息我正在創建這些消息引用其他視圖模型的集合。當我在螞蟻內存分析器中追蹤它們時,消息儘管顯示爲「弱引用」,但沒有釋放其他對象。

一旦我刪除了2個引用,就沒有問題了。快速檢索數據並且無內存泄漏。

Messenger.Default.Register<BroadcastPropertyChanged<ControlContainerTemplate>>(this, (message) => 
     { 
      //// Instance needs to find out if it is a real receiver 
      if (_udfViewModel != null && _udfViewModel.ControlsValue.Any((c) => message.Sender == c)) 
       RaiseBooleanFlagsChanged(); 
     }); 

     Messenger.Default.Register<BroadcastPropertyChanged<ChargeTemplateViewModel>>(this, (message) => 
      { 
       //// Instance needs to find out if it is a real receiver 
       if (_chargeTemplates != null && _chargeTemplates.Any((c) => message.Sender == c)) 
        RaiseBooleanFlagsChanged(); 
}); 

我使用Galasoft.MVVM燈工具包...其中它指出消息不因爲他們是弱引用需要配置,但現在我顯然將不得不尋找替代有我的ViewModels溝通,還是必須在創建該視圖模型的新集合之前查看如何取消註冊這些消息。

關於檢出:http://mvvmlight.codeplex.com/,Laurant已經發現了我現在只能看到的這個問題:)但他正在尋找解決這個問題的MVVM Light工具箱,版本4弱參考實際上是一個薄弱的參考,視圖模型可以由GC發佈和收集。

感謝