如何强制Universal Application释放内存?

O.O*_*O.O 7 c# xaml memory-management win-universal-app windows-10

创建了一个泄漏内存的简单应用程序:

视图

<Page
   ...
    x:Class="App3.MainPage"
    mc:Ignorable="d">
    <StackPanel>
        <Image Width="300" Height="200" 
            Source="/Assets/BBlHOiv.jpg"></Image>
        <Button Click="Button_Click">Navigate</Button>
    </StackPanel>
</Page>
Run Code Online (Sandbox Code Playgroud)

代码背后

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();            
    }

    private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
    {
        this.Frame.Navigate(typeof(MainPage));
    }
Run Code Online (Sandbox Code Playgroud)

每次单击该按钮时,代码都会导航到同一页面上,该页面上有一个图像~400KB.如果我继续快速单击按钮,则每次单击或几次单击都会使内存上升.内存不会被回收,或者至少不能及时回收.在真实的应用程序中,随着更复杂的页面和更复杂的导航(包括圆形导航),这可能成为一个大问题.问题是,如何强制应用程序释放内存?理想情况下,一旦不再需要/显示页面.

我试过以下的事情没有运气.

#1清除帧的导航堆栈

    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);
        this.Frame.BackStack.Clear();
    }
Run Code Online (Sandbox Code Playgroud)

#2使用MVVM时,将DataContext设置为null(在XAML标记中设置datacontext时)

    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);
        this.DataContext = null;
        this.Frame.BackStack.Clear();
    }
Run Code Online (Sandbox Code Playgroud)

Ric*_*rns 0

.Net 中的垃圾收集器按照自己的节奏进行操作,而不一定是在事物关闭时进行。我不建议这样做,但您可以手动调用GC.Collect();. 我会追踪“泄漏”的来源。

有关垃圾收集过程的更多信息: https://msdn.microsoft.com/en-us/library/xe0c2357%28v=vs.110%29.aspx ?f=255&MSPPError=-2147217396