gpt4 book ai didi

c# - 每次刷新都会增加更新私有(private) Observable Collection 的时间

转载 作者:行者123 更新时间:2023-12-03 10:49:52 25 4
gpt4 key购买 nike

我有一个使用 MVVM 方法的 WPF 应用程序。

在我的一个 View 模型中,我有一个私有(private)的可观察集合,我将其设置为“新的 observableCollection”,该集合是通过使用 NHibernate 的 ISession 对象通过存储库类获取数据的查询创建的。

我的 View 模型中有一个私有(private)的可观察集合,我想用从我的查询返回/创建的集合进行更新。

问题是,每次我调用我的方法来执行查询时,每次更新私有(private)对象( ObservableCollection )所花费的时间都会更长。

我测试了查询在存储库中执行所需的时间,它只有 4 或 5 秒。我正在使用延迟加载检索 4500 条记录。

所以我的问题是为什么每次我在 View 模型中调用刷新方法时时间都会增加?另外我还应该补充一点,任务管理器中显示的内存使用量也增加了,所以几乎看起来有内存泄漏?

下面的代码示例:

View 模型:

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;
}

最佳答案

好的,如前所述, View 模型的大小增加了一倍。
当应用程序第一次加载时,它从数据库中加载了 4689 条记录。
每次刷新以从数据库中检索一组新数据时,都会加载另一个 4689,依此类推……依此类推。就内存泄漏而言,这非常严重。

发生这种情况的原因是我在 View 模型中注册了 2 条消息,我正在创建这些消息引用其他 View 模型的集合。当我在 Ants 内存分析器中跟踪它们但没有释放其他对象时,这些消息确实显示为“弱引用”。

一旦我删除了 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 Light Toolkit ......它声明消息不需要处理,因为它们是弱引用,但现在我显然将不得不寻找一种替代方案来让我的 View 模型进行通信,或者将有在创建该 View 模型的新集合之前查看如何取消注册这些消息。

在 checkout :http://mvvmlight.codeplex.com/时,Laurant 发现了我现在才看到的这个问题 :) 但他希望在版本 4 的 MVVM Light 工具包中解决这个问题,以便实际上弱引用是一个弱引用, View 模型可以被 GC 释放和收集。

谢谢

关于c# - 每次刷新都会增加更新私有(private) Observable Collection 的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8326996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com