当CreateOptions不是DelayCreation时,WP7 BitmapImage内存泄漏

时间:2012-04-22 07:20:25

标签: .net windows-phone-7

当CreateOptions是任何东西时,BitmapImage会泄漏内存但是DelayCreation AND放在可视化树中(在Image或ImageBrush中)

我在SDK 7.1和电话(HTC Titan)的仿真器上看到了这个 步骤:

  1. 打开新的WP Project
  2. 在App.xaml.cs中启动一个新的dispatchertimer,每秒打印一次Memory Usage(DeviceStatus)并执行GC.Collect()。 (考虑新建一个字节数组,其大小计算得略小于(MemoryUsageLimit - CurrentMemoryUsage))
  3. 在ContentPanel
  4. 中添加名为ImagePanel的StackPanel
  5. 在ContentPanel中添加2个按钮(1个用于创建和添加10个图像 使用代码的ImagePanel和一个清除ImagePanel的子代的文件
  6. 查找高分辨率图像(只需这样就可以轻松使用内存) 可见)并将其托管在您的本地IIS上
  7. 单击按钮1时,写下:

    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 });
    }
    
  8. 单击按钮2时,写下:

    ImagePanel.Children.Clear();
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    
  9. 尝试使用CreateOptions的所有变体并观察内存的差异。 继续添加和删除元素,并查看您将获得OutOfMemoryException的CreateOption。

    有人可以验证吗?

1 个答案:

答案 0 :(得分:0)

这种预期的行为是不是因为BitmapImage依赖于GDI +? (因此基本上是非托管代码?)IIRC不是ImagePanel泄漏,而是一遍又一遍地创建BitmapImage。

如果将值分配给同一个BitmapImage对象,则不应出现问题。你需要在绘图线程上执行此操作,否则GDI将适合) 就个人而言,每当我在WP7中使用图像时,我都使用ImageTools而不是本机类。输出可以直接分配给图像控件,但可以异步加载,使用更少的内存,操作速度更快