gpt4 book ai didi

c# - 通过绑定(bind)使用 Pivot 的 ItemsSource 属性时发生内存泄漏(+ 重现代码)

转载 作者:行者123 更新时间:2023-11-30 21:00:13 25 4
gpt4 key购买 nike

在我的应用程序中,用户像书本一样使用枢轴,他翻转枢轴项目直到他点击最后一个,然后我删除现有的枢轴项目并加载新的。这一切只需将 Pivot.ItemsSource 属性指向一个新的项目集合即可完成。

我注意到随着时间的推移,内存消耗会增加并且永远不会降低。似乎 Pivot 的 VisualTree 没有得到垃圾收集。

我创建了一个示例应用程序来演示该问题(这是一个 WP8 应用程序):

重现步骤:

  • 启动应用
  • 导航到第 1 页
  • 点击加载更多按钮几次。

    (一次加载 100 个项目,这当然不是我在真实环境中所做的 应用程序,但它清楚地展示了内存 每次消费越来越高,导航回来也不会清零)

对于降低内存的任何提示或建议,我将不胜感激,事实上,如果以这种方式使用足够长的时间,应用程序将不可避免地崩溃。

MainPage.xaml:

...
<HyperlinkButton NavigateUri="/Page1.xaml">
Page1
</HyperlinkButton>
...

MainPage.xaml.cs:

    //...
public MainPage()
{
InitializeComponent();
var timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(2);
timer.Tick += delegate
{
Debug.WriteLine("{0:f} MB, {1:f} MB",
DeviceStatus.ApplicationCurrentMemoryUsage/(1024.0*1024),
DeviceStatus.ApplicationPeakMemoryUsage/(1024.0*1024));
};
timer.Start();
}
//...

Page1.xaml:

<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>

<!--TitlePanel contains the name of the application and page title-->
<StackPanel Grid.Row="0" Margin="12,17,0,28">
<TextBlock Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}" />
<TextBlock Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}" />
</StackPanel>

<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

<StackPanel>
<phone:Pivot x:Name="pivot1" ItemsSource="{Binding Items}">
<!--Pivot item one-->
<phone:Pivot.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" />
</DataTemplate>
</phone:Pivot.ItemTemplate>
</phone:Pivot>
<Button Click="Load_More">Load More</Button>
</StackPanel>
</Grid>
</Grid>

Page1.xaml.cs:

public partial class Page1 : PhoneApplicationPage, INotifyPropertyChanged
{
private List<int> _items;
public List<int> Items
{
get
{
if (_items == null)
{
_items = new List<int>();
}
return _items;
}

set
{
_items = value;
RaisePropertyChanged("Items");
}
}
public Page1()
{
InitializeComponent();
DataContext = this;
}

private void Load_More(object sender, RoutedEventArgs e)
{
var lst = new List<int>();
//100 new items just for demonstration, in reality i won't have more than 6 new items
for (int i = 0; i < 100; i++)
{
lst.Add(i);
}
pivot1.SelectedIndex = 0;
Items=lst;
}

public event PropertyChangedEventHandler PropertyChanged;

void RaisePropertyChanged(string property)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(property));
}
}

~Page1()
{
Debug.WriteLine("Page1 GC");
}
}

最佳答案

Pivot 控件似乎泄漏了,正如使用 Panorama 控件所证明的那样。用这个替换你的堆栈面板(我没有更改控件的名称)不会泄漏。 (内存被回收大约 50 兆)

        <StackPanel>
<Button Click="Load_More">Load More</Button>
<phone:Panorama x:Name="pivot1" ItemsSource="{Binding Items}">
<phone:PanoramaItem></phone:PanoramaItem>
</phone:Panorama>
</StackPanel>

关于c# - 通过绑定(bind)使用 Pivot 的 ItemsSource 属性时发生内存泄漏(+ 重现代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15052230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com