2011-11-30 62 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发布和收集。

感谢