Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.forms 在Xamarin中,如何在使用Navigation.RemovePage()时避免内存泄漏_Xamarin.forms_Uwp_Xamarin.uwp - Fatal编程技术网

Xamarin.forms 在Xamarin中,如何在使用Navigation.RemovePage()时避免内存泄漏

Xamarin.forms 在Xamarin中,如何在使用Navigation.RemovePage()时避免内存泄漏,xamarin.forms,uwp,xamarin.uwp,Xamarin.forms,Uwp,Xamarin.uwp,在我的Xamarin应用程序中,我有五页,第一页、第二页、第三页、第四页和第五页。从第5页导航到第3页时,我调用Navigation.RemovePage()删除NavigationStack中的第4页。但是,调用RemovePage()时存在巨大的内存泄漏。我想知道在尝试删除NavigationStack中两个页面之间的页面时,是否有任何解决方法可以避免内存泄漏?(因为第3页不是根页面,所以我不能使用PopToRootAsync()) 另外,任何人都可以向我解释为什么使用PushModalAs

在我的Xamarin应用程序中,我有五页,第一页、第二页、第三页、第四页和第五页。从第5页导航到第3页时,我调用Navigation.RemovePage()删除NavigationStack中的第4页。但是,调用RemovePage()时存在巨大的内存泄漏。我想知道在尝试删除NavigationStack中两个页面之间的页面时,是否有任何解决方法可以避免内存泄漏?(因为第3页不是根页面,所以我不能使用PopToRootAsync())

另外,任何人都可以向我解释为什么使用PushModalAsync()会删除NavigationStack中的所有页面,只保留当前添加的页面以及NavigationStack和ModalStack中的页面

多谢各位

在Xamarin中,如何在使用Navigation.RemovePage()时避免内存泄漏

在测试过程中,调用
RemovePage
方法时不会泄漏内存

private void Button_Clicked(object sender, EventArgs e)
{
    Navigation.RemovePage( Navigation.NavigationStack.Where(a=> a is Page4).FirstOrDefault());
}
任何人都可以向我解释为什么使用PushModalAsync()会删除
NavigationStack
中的所有页面,并且只保留当前添加的页面以及NavigationStack和ModalStack中的页面

与UWP平台中的导航行为相匹配,显示出良好的性能。而且它不会影响
NavigationStack

下面是测试代码

private void PushClick(object sender, EventArgs e)
{
    Navigation.PushModalAsync(new MainPage());
    foreach (var item in Navigation.NavigationStack)
    {
        System.Diagnostics.Debug.WriteLine(item.GetType().Name);
    }
}

有关完整的代码示例,请参阅此。

一个简单的测试来检查您的应用程序是否泄漏内存可能会有所帮助。在您正在调查的操作之后强制执行垃圾收集。了解.net垃圾收集器的工作原理也可能有所帮助。 在删除页面之前和之后查看内存消耗。出于测试目的,请在删除页面后立即强制垃圾回收

private void Button_Clicked(object sender, EventArgs e)
{
    Navigation.RemovePage( Navigation.NavigationStack.Where(a=> a is Page4).FirstOrDefault());
    GC.Collect(2, GCCollectionMode.Forced);
} 

您是如何确定内存泄漏的?该应用程序正在UWP上运行。我使用VisualStudio的诊断工具来查看内存使用量的快速增加。在任务管理器中,它还显示内存使用量快速增加。在安卓和iOS平台上运行良好,没有内存泄漏。在比较这些内存值时,您知道垃圾收集器是否运行了吗?只是想确保它是一个真正的内存泄漏,而不是简单的未收集的内存,直到GC清理后才被释放up@MouseOnMars首先,我不确定GC什么时候可以释放内存,而且我的UWP上的内存使用似乎永远不会减少。Nico从第1页到第2页,第2页到第3页,然后删除第2页并返回到第1页的示例也会导致内存泄漏,正如Visual Studio诊断工具所示。您可以对此进行测试,以查看是否发生内存泄漏。这里是链接。非常感谢,非常感谢尼科。我已经测试了您的完整示例代码。我在代码中添加了一些显示RemovePage()内存泄漏的内容。我不确定这是否叫做内存泄漏。示例是Page1->Page2和Page2->Page3,然后有一个名为ToPage1的按钮,它使用RemovePage()删除第2页,然后再弹出到第1页。我通过快速单击来测试它,然后VisualStudio诊断工具中的内存使用情况显示内存增长缓慢,因为没有其他绑定?你能帮我测试一下,看看你是否得到了和我一样的结果吗?关于修改后的代码,请参考此。我不确定这是否是内存泄漏。多谢各位@Nico ZhuI认为给出的示例代码没有绑定。RemovePage()api可能会删除内容页的布局,但不会删除页面的绑定,这可能是使用MVVM模式在我的应用程序上发生内存泄漏的原因。你知道我如何解决这个问题吗?非常感谢。对于测试,Page2的ViewModel将导致内存增加。但这是正常的,因为您在其中实现了10000字符串对象。当您从导航堆栈中删除page2时,page2实例不会立即销毁。内存收集将由系统管理。因此,您的意思是,随着内存的增加,它是正常的。这不是内存泄漏问题吗?然而,这只是一个示例,当人们使用应用程序(不是这个)时,它会导致相同的问题,然后非常快地建立内存,直到应用程序内存使用量变为500MB或1GB,然后变得非常缓慢。有办法解决吗?多谢各位@在测试期间,GC不会立即清理内存,CLR将根据对象引用类型(弱或强)清理未使用的对象。最重要的是,它将自动处理。我不确定我是否理解。为什么只收集几代人?不管您使用的是强引用还是弱引用,一旦删除页面,页面及其所有关联的UI和您创建的其他对象都应该是“垃圾回收”的。这就像砍掉一棵树的一根树枝,所有附着在这根树枝上的东西都应该是可以收藏的。如果不是你有记忆的话,非常感谢尼科。将尝试使用您的方式测试内存泄漏。我会告诉你发生了什么。