我有一个主页,其中我有3个透视项目,每个我有一个重的ListBox(每个大约15Mb,这是正常的吗?)。 当某些动作发生时,我在另一个页面中导航,在那里我有另外一个包含3个项目的Pivot控件。到目前为止,一切都很好。 当我导航回主页面时,我可以看到使用内存+2到+ 4mb的差异。每次我导航到新页面然后返回主页面时,另外2-4 MB将被添加到总使用的内存中。我很确定我的代码没有任何问题。即使我的代码中存在内存泄漏,也不会那么大。这可能与一些未发布的UI元素有关?我在两个页面jsut手动调用垃圾收集器onNavigatedFrom和onNavigatedTo,以防万一,但仍然相同..
这可能是某些控制中的内存泄漏吗?正如我告诉你的那样,这两个页面都包含带有数据绑定列表框的数据透视项,并且数据在运行时不会改变。
谢谢
答案 0 :(得分:3)
如果您在页面上使用的任何控件都有泄漏,那么这将导致页面的整个元素树泄漏(因为每个子节点都保留对其父节点的引用,反之亦然)。
即使您的代码是干净的,如果您从具有泄漏的外部方使用控件,您的页面也可能会泄漏。在这种情况下,您可以通过从OnNavigatingFrom()中的树中删除有问题的元素来减轻影响。这样只会泄露该控件,而不是整个页面。
广告控制目前属于该类别。以下是对此的指导: http://msdn.microsoft.com/en-us/library/gg491975(v=msads.10).aspx
SL Toolkit中的ContextMenu的类似故事,如果您正在使用它。
答案 1 :(得分:2)
http://forums.create.msdn.com/forums/p/76007/466968.aspx的讨论对我的应用非常有帮助。
我做过的事情&工作(来自上面的链接):
#if DEBUG
~MyPageView()
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(new System.Action(() =>
{
System.Windows.MessageBox.Show("MyPageView Destructing");
// Seeing this message box assures that this page is being cleaned up
}));
}
#endif
private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
{
#if DEBUG
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
#endif
// Other usual stuff in this method
}
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
// Clear the page datacontext
this.DataContext = null;
// Clear any other datacontexts esp if the life time of the databound objects are different.
MyDownloadProgressBar.DataContext = null;
// Make sure that if there are any references to elements scoped to this page's lifetime are being held by any other global objects, then they should be cleared here
}
当我在应用程序中找到更多管理内存的方法/提示时,我会不断更新此答案。
答案 2 :(得分:0)
抱歉,我的英语非常糟糕。无论如何。我有同样的问题。我这样解决了。
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
base.OnBackKeyPress(e);
timer.Tick -= timer_Tick;
this.Loaded -= new RoutedEventHandler(timer_Tick);
AnaMenu.cli.GetAboutCompleted -= client_GetAboutCompleted;
}
我将-=
用于事件。并修复它