UWP:如何正确清理ViewModel?

时间:2017-01-26 20:03:54

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

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

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

每次打开详细信息页面时,我都会看到内存使用了 25多个Mo :因此,在十几个页面加载后,应用程序变为慢...

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

所以我尝试在 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);

当用户通过后退按钮,通过 App.xaml.cs <中的 AppBackButtonPressed()返回主页时,我也会调用它/强>:

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

这没有错误,但它似乎不是实现它的好方法......

在某些示例中,清理()会在页面的结束事件上加注,而在UWP上并不存在。

那么使用UWP有更简洁的方法吗?

1 个答案:

答案 0 :(得分:1)

如果没有完全重复你正在做的事情,很难确定,但看起来问题不在于清理ViewModes,而是用于显示它们的页面。如果你继续向前导航,你最终会得到多个页面,每个页面都会占用内存。 (内存分析工具将显示内存的使用位置,您应该使用它们来验证实际问题。)

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

如果您在从详细信息页面导航回主页面时仍然遇到内存泄漏问题,则问题将出现在详细信息页面中,导致无法收集内存。需要更多细节(最好是一个复制品)来确定原因。