【问题标题】:UWP: how to Cleanup properly a ViewModel?UWP:如何正确清理 ViewModel?
【发布时间】:2017-01-26 20:03:54
【问题描述】:

我开发了一个使用 MvvmLight 的 UWP 应用,但存在一些内存泄漏。 我的应用包含 2 个主要页面:

  • 主页页面,包含表单列表
  • 详细信息页面,包含所选表单的所有详细信息(数据、照片等)

每次打开详细信息页面,我都可以看到内存使用了25个Mo:所以在加载了十几个页面后,应用程序变为慢一点……

我的 ViewModel 继承自 ViewModelBase,因此我可以使用 Cleanup()

所以我尝试像这样在 DetailsViewModel 中使用它:

public override void Cleanup()
{
    Messenger.Default.Unregister<SendImageOnDetailsViewModel>(this);
    Messenger.Default.Unregister<SendDeletedImageOnDetailsViewModel>(this);
    VComponentBoms = null;
    VComponentOrders = null;
    VCoreOrders = null;
    CarForm = null;
    base.Cleanup();
}

我直接在 DetailsViewModel 上调用它,在用户保存表单之后,在他返回 HomeViewModel 之前:

Cleanup();
NavigationService.NavigateTo<HomeViewModel>(this, new object[] { }, "RefreshForms", new object[] { }, false);

当用户通过 Back 按钮,通过 App.xaml.csAppBackButtonPressed() 返回主页时,我也会调用它/strong>:

if (cur.GetType() == typeof(DetailsViewModel))
{
    cur.Cleanup();
    GC.Collect();
}

这可以正常工作,但似乎不是实现它的好方法...

在某些示例中,Cleanup() 在页面的 Closing 事件 上引发,而 UWP 上不存在该事件。

那么有没有更简洁的方法可以用 UWP 做到这一点?

【问题讨论】:

  • 如何缓存页面(NavigationCacheMode)?顺便说一句,你不应该使用 GC.Collect()...

标签: c# memory-leaks uwp mvvm-light viewmodellocator


【解决方案1】:

如果没有对您正在做的事情进行完整的重现,就很难确定,但看起来问题不在于清理 ViewModel,而在于用于显示它们的页面。如果您继续向前导航,您最终会得到多个页面,每个页面都会耗尽内存。 (内存分析工具会向您显示内存的使用位置,您应该使用这些工具来验证实际问题是什么。)

假设问题是创建了多个页面,那么在查看详细信息页面后,您应该导航回主页,而不是转发到主页。
如果您继续,则将创建主页的另一个副本,并且此页面和内容的重复将是泄漏的原因。 如果您返回,则可以收集您离开的页面。请注意,这不一定会立即完成。

如果您在从详细信息页面导航回主页时仍然遇到内存泄漏问题,那么问题将是详细信息页面中的某些内容阻止了内存被收集。需要更多细节(最好是重现)来确定原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2013-11-10
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多