gpt4 book ai didi

c# - WP8内存泄漏打开和关闭PhoneApplicationPage

转载 作者:行者123 更新时间:2023-11-30 16:17:14 25 4
gpt4 key购买 nike

我正在创建一个显示缩略图列表的 Windows 手机应用程序。我正在使用 LongListSelector 来执行此操作。

当我前后导航到缩略图列表时,我的应用程序有时会发生内存泄漏。我在使用应用程序时检查了内存使用情况,发现打开带有缩略图的页面时内存增加了(正如我所料)。当我导航回上一页时,内存使用量减少但没有增加那么多。多次重复该过程,最终导致内存不足异常。

我创建了一个只有两个页面的测试应用程序。一个带有导航到另一个按钮的按钮,该按钮在 LongListSelector 中加载一组 potos。我创建此应用程序是为了确保内存泄漏不是由其他原因引起的。

在这个简单的测试中,内存使用情况与在我的应用中一样。

这是我的缩略图页面的主要代码:

public class testObject
{
public string Title { get; set; }
public BitmapImage Thumbnail { get; set; }
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{

photosList = new List<testObject>();
for (int i = 0; i < 200; i++)
{
BitmapImage bi = new BitmapImage(new Uri("/images/"
+ i.ToString()+".jpg",
UriKind.RelativeOrAbsolute));


photosList.Add(new testObject { Title = i.ToString(),
Thumbnail = bi });
}

GridPictures.ItemsSource = photosList;

}

protected override void OnBackKeyPress(
System.ComponentModel.CancelEventArgs e)
{
foreach (testObject test in photosList)
{
test.Thumbnail.DecodePixelHeight = 1;
test.Thumbnail.DecodePixelWidth = 1;
test.Thumbnail = null;
}
photosList.Clear();
photosList = null;

base.OnBackKeyPress(e);
}

这是另一个页面上按钮的代码:

private void Button_Click_1(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.RelativeOrAbsolute));

}

最佳答案

LongListSelector 是已知的泄漏源。当您使用像 Image 这样占用大量内存的控件时,这些泄漏会变得特别麻烦。

到目前为止,最好的解决方案是完全避免使用 LongListSelector。但是如果您找不到合适的替代方案,您有一些解决方法:

  • 在Page1中,在OnNavigatedFrom事件中,强制释放图片。有几种方法可以做到这一点,但通常将 ImageSource 属性设置为 null 就足够了

  • 制作一个自定义控件来为您完成繁重的工作

自定义控件可能如下所示:

public class SafePicture : System.Windows.Controls.ContentControl
{
public SafePicture()
{
this.Unloaded += this.SafePictureUnloaded;
}

private void SafePictureUnloaded(object sender, System.Windows.RoutedEventArgs e)
{
var image = this.Content as System.Windows.Controls.Image;

if (image != null)
{
image.Source = null;
}
}
}

然后,只需将所有图片包装在该控件中:

<my:SafePicture>
<Image Source="{Binding Path=Thumbnail}" />
</my:SafePicture>

这应该可以解决问题。请注意,您仍然会泄漏内存,但泄漏量要合理得多。

关于c# - WP8内存泄漏打开和关闭PhoneApplicationPage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17492839/

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