Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
C# 在UWP中删除导航缓存_C#_Performance_Memory Leaks_Uwp_Uwp Xaml - Fatal编程技术网

C# 在UWP中删除导航缓存

C# 在UWP中删除导航缓存,c#,performance,memory-leaks,uwp,uwp-xaml,C#,Performance,Memory Leaks,Uwp,Uwp Xaml,在我的UWP应用程序中,我不断地从第1页导航到第2页,再从第2页导航到第1页,这个导航循环在两个页面的提交按钮上重复。在应用程序启动时,它的性能很好,但当页面进一步导航时,它占用了更多内存,并且应用程序在导航15或20次后速度变慢。我试图通过减小导航缓存的大小来删除它,但没有帮助。在我的研究中,我发现如果导航模式设置为enabled(启用),则会减少一些内存使用。但当我保持启用状态时,以前的数据不会被删除。我需要一个解决方案来删除以前页面的内存,并使我的应用程序使用更少的内存,即使它浏览了很多次

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

问题是UWP引擎不会破坏您的页面,即使它不再在Navigation堆栈中

但有解决办法:

  • 请勿在XAML代码中使用
    NavigationCacheMode
  • 在每个页面上都必须覆盖
    OnNavigatedTo()
    ,当
    导航模式
    新建时,需要更改
    导航缓存模式
  • 在每个页面上都必须覆盖
    OnNavigatingFrom()
    ,当
    导航模式
    返回时,将禁用更改
    导航缓存模式
  • 使用此机制,您可以实现以下功能:导航堆栈上的每个页面都是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;
        }
    

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

    您读过这篇文章吗:是的,我读过。但问题是,如果我将NavigationMode保持为启用状态,则页面中以前的数据将无法运行。如果我根据用户在第1页中的输入进行了一些修改,并且在我从第2页返回时再次进行修改,那么这些修改将不会继续。但我希望每次回来都有新的一页。请出示您的性能分析器。如果执行强制GC收集,也会显示结果。