UWP导航内存泄漏

时间:2019-06-19 20:49:05

标签: c# memory-leaks uwp navigation

我们注意到,我们的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,这无济于事。

我在这里做什么错了?

An image of memory use after clicking on the Navigate button for a while

1 个答案:

答案 0 :(得分:1)

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

在第1页的代码中:

 protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);

        System.GC.Collect();
    }

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