如何强制Universal Application释放内存?

时间:2015-08-13 15:30:07

标签: c# xaml memory-management win-universal-app windows-10

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

查看

    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);
        this.Frame.BackStack.Clear();
    }

代码背后

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

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

我已经尝试过以下事情而没有运气。

#1清除相框的导航栏

{{1}}

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

{{1}}

2 个答案:

答案 0 :(得分:0)

.Net中的垃圾收集器按照自己的步调进行,而不一定是在事情结束时。我不建议这样做,但您可以手动拨打GC.Collect();。我会追查"泄漏的来源"。

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

答案 1 :(得分:0)

如果图像的数量和大小不太大,则可以将图像作为静态资源加载到App对象中,并且页面可以引用这些图像(StaticResource)。这样,它们只会在启动时加载一次,并且应该很快出现。

如果这将需要过多的内存,则另一种选择是在打开页面时以代码的形式加载图像,保留对该图像的引用,并在页面关闭时显式处理该图像。这样会比较慢,但可以节省内存。再次,如前所述,不能保证在调用Dispose后立即释放内存。