1

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

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

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

我的 ViewModels 继承自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();
}

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

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

当用户通过App.xaml.cs中的AppBackButtonPressed()通过Back button 返回主页时,我也会调用它:

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

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

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

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

4

1 回答 1

1

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

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

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

于 2017-01-26T22:57:33.857 回答