.net 当CreateOptions不是DelayCreation时,WP7 BitmapImage内存泄漏
当CreateOptions不是DelayCreation并放入可视树(图像或图像笔刷中)时,BitmapImage会泄漏内存 我在带有SDK 7.1的模拟器和手机(HTC Titan)上看到了这一点 步骤:.net 当CreateOptions不是DelayCreation时,WP7 BitmapImage内存泄漏,.net,windows-phone-7,.net,Windows Phone 7,当CreateOptions不是DelayCreation并放入可视树(图像或图像笔刷中)时,BitmapImage会泄漏内存 我在带有SDK 7.1的模拟器和手机(HTC Titan)上看到了这一点 步骤: 打开新的WP项目 在App.xaml.cs中启动一个新的Dispatchermer,它每秒打印内存使用情况(DeviceStatus),并执行GC.Collect()。(考虑重新创建一个字节数组,其大小计算为略小于(MemoryUsageLimit-CurrentMemoryUsage))
Random rand = new Random();
for(int i=0 ; i<10 ; i++)
{
//use 192.168.55.100 instead of localhost when running on the phone
//to be able to see traffic in fiddler.Change localhost to machinename for the emulator
var uri = "http://localhost/images/bigimage.jpg?tc=" + rand.Next(Int32.MaxValue);
var bitmap = new BitmapImage
{
UriSource = new Uri(uri, UriKind.RelativeOrAbsolute),
CreateOptions = BackgroundCreation //or None or DelayCreation
};
ImagePanel.Children.Add(new Image { Source = bitmap });
}
ImagePanel.Children.Clear();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
有人可以验证吗?这不是预期的行为,因为BitmapImage依赖于GDI+?(因此本质上是非托管代码?)IIRC不是ImagePanel泄漏,而是一次又一次创建的BitmapImage 如果将该值指定给同一BitmapImage对象,则不会出现问题。您确实需要在绘图线程上执行此操作,否则GDI将有一个合适的选项)
就我个人而言,每当我在WP7中使用图像时,我都使用它来代替本机类。输出可以直接分配给图像控件,但可以异步加载,使用更少的内存,并且操作速度更快@atomaras-仅仅因为您要求它消失,并不意味着GC将实际执行此操作。这里没有泄漏。获取OutOfMemoryException不是一个很好的指示器,表明它不可收集吗?出于好奇,如果调用
ImagePanel.Children.ClearviaDispatcher.BeginInvoke()
,会发生什么BackgroundCreation
在后台创建新线程,在UI线程上清除它是否有帮助?(我没有测试代码,所以我假设存在内存泄漏)。我在我的一个应用程序中遇到了类似的行为。我必须手动将所有图像控件的源设置为null,以避免内存泄漏。