【发布时间】:2015-11-06 16:13:53
【问题描述】:
创建了一个泄漏内存的简单应用:
查看
<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(当在 XAML 标记中设置 datacontext 时)
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
this.DataContext = null;
this.Frame.BackStack.Clear();
}
【问题讨论】:
标签: c# xaml memory-management win-universal-app windows-10