WP7内存泄漏? - 使用列表框数据绑定在包含透视项的页面之间导航

时间:2011-01-28 18:03:22

标签: xaml silverlight windows-phone-7

我有一个主页,其中我有3个透视项目,每个我有一个重的ListBox(每个大约15Mb,这是正常的吗?)。 当某些动作发生时,我在另一个页面中导航,在那里我有另外一个包含3个项目的Pivot控件。到目前为止,一切都很好。 当我导航回主页面时,我可以看到使用内存+2到+ 4mb的差异。每次我导航到新页面然后返回主页面时,另外2-4 MB将被添加到总使用的内存中。我很确定我的代码没有任何问题。即使我的代码中存在内存泄漏,也不会那么大。这可能与一些未发布的UI元素有关?我在两个页面jsut手动调用垃圾收集器onNavigatedFrom和onNavigatedTo,以防万一,但仍然相同..

这可能是某些控制中的内存泄漏吗?正如我告诉你的那样,这两个页面都包含带有数据绑定列表框的数据透视项,并且数据在运行时不会改变。

谢谢

3 个答案:

答案 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的讨论对我的应用非常有帮助。

我做过的事情&工作(来自上面的链接):

  • 为所有页面声明析构函数(仅限DEBUG)
#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
  • 在CompleteInitializePhoneApplication方法
  • 中添加以下App.xaml
        private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
        {
#if DEBUG
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
#endif
            // Other usual stuff in this method
        }
  • 清除所有DataContext的导航离开页面
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;
    }

我将-=用于事件。并修复它