c# - 删除 UWP 中的导航缓存

标签 c# performance memory-leaks uwp uwp-xaml

在我的 UWP 应用程序中,我不断地从第 1 页导航到第 2 页,然后再次从第 2 页导航到第 1 页,并且此导航循环再次在两个页面的提交按钮上重复。在应用程序启动时,它的性能很好,但当页面进一步导航时,它会占用更多内存,并且应用程序在导航 15 或 20 次后变慢。我尝试通过减小它的大小来删除导航缓存,但它没有帮助,在我的研究中我发现如果导航模式设置为启用它会减少一些内存使用。但是当我保持启用状态时,以前的数据不会消失。我需要一个解决方案来删除以前页面的内存,并使我的应用程序即使在多次导航后也能使用更少的内存。

最佳答案

问题是 UWP 引擎不会破坏您的页面,即使它不再位于导航堆栈中也是如此。

但是有解决办法:

  1. 不要在 XAML 代码中使用 NavigationCacheMode
  2. 在每个页面上都必须覆盖 OnNavigatedTo() 并且当 NavigationModeNew 时,更改 NavigationCacheMode必填
  3. 在每个页面上都必须覆盖 OnNavigatingFrom() 并且当 NavigationModeBack 时,更改 NavigationCacheMode残疾

通过这种机制,您可以实现以下目标:导航堆栈上的每个页面都是 Cache=Required,每个不在导航堆栈上的页面都是 Cache=Disabled。

但是有一些当用户按下前进时页面是新分配的,所以之前的状态丢失了。

在某些情况下,禁用缓存模式还不够,UWP 仍将页面保留在内存中。在这种情况下,我们必须删除缓存。如果我们将当前帧缓存大小重置为零并返回原始大小,我们就可以做到这一点。

这是我在每个页面中的代码:

    protected override void OnNavigatedTo( NavigationEventArgs navigationEvent )
    {
        // call the original OnNavigatedTo
        base.OnNavigatedTo( navigationEvent );

        // when the dialog displays then we create viewmodel and set the cache mode
        if( CreatedViewModel == null || navigationEvent.NavigationMode == NavigationMode.New )
        {
            // set the cache mode
            NavigationCacheMode = NavigationCacheMode.Required;

            // create viewmodel
            CreatedViewModel = CreateViewModel( navigationEvent.Parameter );
            DataContext = CreatedViewModel;
            CreatedViewModel.InitializeAsync().ConfigureAwait( false );
        }
    }

    protected override void OnNavigatingFrom( NavigatingCancelEventArgs navigationEvent )
    {
        // call the original OnNavigatingFrom
        base.OnNavigatingFrom( navigationEvent );

        // when the dialog is removed from navigation stack 
        if( navigationEvent.NavigationMode == NavigationMode.Back )
        {
            // set the cache mode
            NavigationCacheMode = NavigationCacheMode.Disabled;

            ResetPageCache();
        }
    }

    private void ResetPageCache()
    {
        int cacheSize = ((Frame)Parent).CacheSize;

        ((Frame)Parent).CacheSize = 0;
        ((Frame)Parent).CacheSize = cacheSize;
    }

一些注意事项:当您创建一个 BasePage 并将此代码放入其中时会更舒服,并且您可以在每个 Page 中从该 BasePage 派生。

关于c# - 删除 UWP 中的导航缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51003487/

相关文章:

c++ - Boost asio async_write_some 泄漏?

c++ - 如何为服务器运行 valgrind?

c# - 更新服务引用后项目未构建

MYSQL - 在 View 内多次调​​用函数时的性能问题

Javascript一次请求多个JS文件

performance - 整数运算性能 32 位与 64 位

c - 将 Vala 与 C 结合使用时出现内存泄漏

c# - Queue<T>.Dequeue 返回 null

c# - Blazor- EditForm InputCheckbox 可为 null 的 bools 问题变通

c# - C# 中 "using"指令关键字的替代方法?