如何强制释放通用应用程序的内存?

7

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

视图

<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>

后台代码

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));
    }

每次点击按钮时,代码都会导航到同一个页面,该页面上有一张大约400KB的图片。如果我继续以快速的速度点击按钮,则每次点击或每隔几次点击内存就会增加。内存没有被回收,或者至少没有及时回收。在一个真实的应用程序中,由于页面更加复杂、导航更加复杂(包括循环导航),这可能成为一个大问题。问题是如何强制应用程序释放内存?理想情况下,一旦不再需要/显示页面。

我尝试了以下事项但没有成功。

#1 清除框架的导航堆栈

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

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

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

0

0
如果图像的数量和大小不是太大,可以将它们作为静态资源加载到应用程序对象中,并且页面可以引用这些资源(StaticResource)。这样它们只会在启动时加载一次,应该会非常快速地显示。
如果这需要太多的内存,另一个选择是在打开页面时在代码中加载图像,保留对图像的引用,在页面关闭时显式地释放图像。这样做会更慢,但可能会节省内存。同样,如前所述,不能保证调用Dispose后立即释放内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接