C# UWP:如何正确清理ViewModel?
我开发了一个UWP应用程序,它使用了MvvmLight,但是存在一些内存泄漏。 我的应用程序包含2个主页: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
- 主页页面,包含表单列表
- 详细信息页面,包含所选表单的所有详细信息(数据、照片等)
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();
}