【问题标题】:UWP navigation memory leakUWP 导航内存泄漏
【发布时间】:2019-06-19 20:49:05
【问题描述】:

我们注意到我们的 UWP 应用存在内存泄漏。我调查了一下,发现当导航到新页面时,内存变高了,即使在 GC 运行时似乎也没有下降太多。

我整理了一个由两页组成的小副本:

  1. 主页
<Page>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="70" />
            <RowDefinition  />
        </Grid.RowDefinitions>

        <Button x:Name="navigateButton" Content="Navigate" HorizontalAlignment="Center"
                    Click="NavigateButton_Click" />

        <Frame x:Name="mainFrame" IsNavigationStackEnabled="False"
               Padding="10" Grid.Row="1" />
    </Grid>
</Page>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private void NavigateButton_Click(object sender, RoutedEventArgs e)
        {
            mainFrame.Navigate(typeof(Page1), null, new Windows.UI.Xaml.Media.Animation.DrillInNavigationTransitionInfo());
        }
    }
  1. 第1页:
<Page>
    <VariableSizedWrapGrid ItemWidth="100" ItemHeight="60">
        <Button Padding="20, 10" Content="Hello!"/>
        <Button Padding="20, 10" Content="Hello!"/>
        <Button Padding="20, 10" Content="Hello!"/>
        <Button Padding="20, 10" Content="Hello!"/>
        <Button Padding="20, 10" Content="Hello!"/>

        <!-- And 25 more buttons here -->
    </VariableSizedWrapGrid>
</Page>
    public sealed partial class Page1 : Page
    {
        public Page1()
        {
            this.InitializeComponent();
        }

        ~Page1()
        {
            Debug.WriteLine("Page dead :(");
        }
    }

完整的源代码可在GitHub 获得。

你可以看到复制的a video

我也尝试过将Frame.IsNavigationStackEnabled 设置为 false,但没有帮助。

我在这里做错了什么?

【问题讨论】:

    标签: c# memory-leaks uwp navigation


    【解决方案1】:

    我使用的是 Windows 1803,因为我没有最新的 1809,但我认为它的工作原理相同,

    在第1页的代码中:

     protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);
    
            System.GC.Collect();
        }
    

    这是另一种检查应用程序是否必须处置页面的方法。并且有效。

    【讨论】:

    • 感谢您的宝贵时间。你的意思是我应该在每个页面上调用 GC.Cllect() 还是只是这样做以查看页面是否正确处理?
    • 我试过了,确实,内存消耗的增长速度要慢得多,但它仍然会增加,而且似乎没有被回收。我会在其他应用程序中尝试一下,看看它是否能解决问题。虽然老实说我不喜欢明确地调用 GC。
    • 好吧,这肯定是 UWP 内部的错误,因为页面应该会自动卸载。可能是在 1903 年解决了,因为我认为在 1803 年 IsNavigationStackEnabled 是一个新属性,但看起来它没有效果。我通常做的是拥有一种页面的一个实例,然后只更改视图模型。很大程度上取决于应用环境。
    • 是的,IsNavigationStackEnabled 是在 1809 年添加的。共享页面实例和切换虚拟机似乎是一个不错的方法。
    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多