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)
.Net 中的垃圾收集器按照自己的节奏进行操作,而不一定是在事物关闭时进行。我不建议这样做,但您可以手动调用GC.Collect();. 我会追踪“泄漏”的来源。
有关垃圾收集过程的更多信息: https://msdn.microsoft.com/en-us/library/xe0c2357%28v=vs.110%29.aspx ?f=255&MSPPError=-2147217396