C# UWP:如何正确清理ViewModel?

C# UWP:如何正确清理ViewModel?,c#,memory-leaks,uwp,mvvm-light,viewmodellocator,C#,Memory Leaks,Uwp,Mvvm Light,Viewmodellocator,我开发了一个UWP应用程序,它使用了MvvmLight,但是存在一些内存泄漏。 我的应用程序包含2个主页: 主页页面,包含表单列表 详细信息页面,包含所选表单的所有详细信息(数据、照片等) 每次我打开详细信息页面时,我都可以看到内存使用的Mo增加了25个:因此在加载了十几个页面后,应用程序的速度会变慢 我的ViewModels继承自ViewModelBase,因此我可以使用Cleanup() 因此,我尝试在详细视图模型中使用它,如下所示: public override void Clean

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

  • 主页页面,包含表单列表
  • 详细信息页面,包含所选表单的所有详细信息(数据、照片等)
每次我打开详细信息页面时,我都可以看到内存使用的Mo增加了25个:因此在加载了十几个页面后,应用程序的速度会变慢

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

因此,我尝试在详细视图模型中使用它,如下所示:

public override void Cleanup()
{
    Messenger.Default.Unregister<SendImageOnDetailsViewModel>(this);
    Messenger.Default.Unregister<SendDeletedImageOnDetailsViewModel>(this);
    VComponentBoms = null;
    VComponentOrders = null;
    VCoreOrders = null;
    CarForm = null;
    base.Cleanup();
}
这是没有错误的,但它似乎不是实现它的好方法

在某些示例中,页面的关闭事件会引发清理()


那么,有没有一种更干净的方法来使用UWP实现这一点呢?

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

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

如果在从详细信息页导航回主页时仍然存在内存泄漏问题,则该问题将是详细信息页中的某个内容阻止收集内存。需要更多的细节(最好是重做)来确定原因。

如何缓存页面(NavigationCacheMode)?顺便说一句,你不应该使用GC.Collect()。。。
Cleanup();
NavigationService.NavigateTo<HomeViewModel>(this, new object[] { }, "RefreshForms", new object[] { }, false);
if (cur.GetType() == typeof(DetailsViewModel))
{
    cur.Cleanup();
    GC.Collect();
}