Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xaml WP7内存泄漏?-使用listbox数据绑定在包含透视项的页面之间导航_Xaml_Silverlight_Windows Phone 7 - Fatal编程技术网

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

Xaml WP7内存泄漏?-使用listbox数据绑定在包含透视项的页面之间导航,xaml,silverlight,windows-phone-7,Xaml,Silverlight,Windows Phone 7,我有一个主页,其中我有3个轴心项目,在每一个我有一个列表框,这是沉重的(约15Mb每一个,这是正常的?)。 当某个动作发生时,我会在另一个页面中导航,其中有另一个包含3项的Pivot控件。到目前为止,一切都很好。 当我导航回主页时,我可以看到所用内存+2到+4mb之间的差异。每次我导航到新页面,然后返回主页时,总使用内存会增加2-4 mb。我非常确信我的代码中没有任何错误。即使我的代码中有内存泄漏,也不会那么大。这可能与一些未发布的UI元素有关?我在两个页面jsut中手动调用垃圾收集器onNav

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

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


谢谢

如果您在页面上使用的任何控件发生泄漏,则这将导致页面的整个元素树泄漏(因为每个子元素都保留对其父元素的引用,反之亦然)

即使您的代码是干净的,如果您使用了来自有泄漏的外部方的控件,页面也可能泄漏。在这种情况下,您可以通过在OnNavigatingFrom()中从树中删除有问题的元素来减轻影响。通过这种方式,只有控件泄漏,而不是整个页面

广告控件当前属于该类别。以下是相关指南:


如果您正在使用SL Toolkit中的ContextMenu,情况与此类似。

如果您在页面上使用的任何控件存在泄漏,则这将导致页面的整个元素树泄漏(因为每个子元素都保留对其父元素的引用,反之亦然)

即使您的代码是干净的,如果您使用了来自有泄漏的外部方的控件,页面也可能泄漏。在这种情况下,您可以通过在OnNavigatingFrom()中从树中删除有问题的元素来减轻影响。通过这种方式,只有控件泄漏,而不是整个页面

广告控件当前属于该类别。以下是相关指南:

如果您正在使用SL Toolkit中的ContextMenu,情况与此类似。

上的讨论对我的应用程序非常有帮助

我做过和做过的事情(从上面的链接):

  • 为所有页面声明析构函数(仅限调试)
#如果调试
~MyPageView()
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(新的System.Action(()=>
{
System.Windows.MessageBox.Show(“MyPageView销毁”);
//看到此消息框可确保此页面正在清理
}));
}
#恩迪夫
  • 在CompleteInitializePhoneApplication方法中将以下内容添加到App.xaml
private void completeInitializePhone应用程序(对象发送方,NavigationEventArgs e)
{
#如果调试
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
#恩迪夫
//这种方法中的其他常用材料
}
  • 在导航离开页面时清除所有DataContext
受保护的覆盖无效OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
基于(e)的导航;
//清除页面数据上下文
this.DataContext=null;
//如果数据绑定对象的生存期不同,请清除任何其他数据上下文。
MyDownloadProgressBar.DataContext=null;
//确保任何其他全局对象都持有对该页生存期范围内的元素的引用,则应在此处清除这些引用
}
随着我找到更多管理应用程序内存的方法/技巧,我将不断更新此答案。

上的讨论对我的应用程序非常有帮助

我做过和做过的事情(从上面的链接):

  • 为所有页面声明析构函数(仅限调试)
#如果调试
~MyPageView()
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(新的System.Action(()=>
{
System.Windows.MessageBox.Show(“MyPageView销毁”);
//看到此消息框可确保此页面正在清理
}));
}
#恩迪夫
  • 在CompleteInitializePhoneApplication方法中将以下内容添加到App.xaml
private void completeInitializePhone应用程序(对象发送方,NavigationEventArgs e)
{
#如果调试
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
#恩迪夫
//这种方法中的其他常用材料
}
  • 在导航离开页面时清除所有DataContext
受保护的覆盖无效OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
基于(e)的导航;
//清除页面数据上下文
this.DataContext=null;
//如果数据绑定对象的生存期不同,请清除任何其他数据上下文。
MyDownloadProgressBar.DataContext=null;
//确保任何其他全局对象都持有对该页生存期范围内的元素的引用,则应在此处清除这些引用
}

随着我在应用程序中找到更多管理内存的方法/技巧,我会不断更新这个答案。

对不起,我的英语很差。无论如何我也有同样的问题。我是这样解决的

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

我对事件使用了
-=
。并修复了它

对不起,我的英语很差。无论如何我也有同样的问题。我是这样解决的

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

我对事件使用了
-=
。并且修复了它

您是否为页面中的任何事件添加事件处理程序?无法停止侦听这些事件是导致内存泄漏的常见原因