Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
.net 当CreateOptions不是DelayCreation时,WP7 BitmapImage内存泄漏_.net_Windows Phone 7 - Fatal编程技术网

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

.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))

当CreateOptions不是DelayCreation并放入可视树(图像或图像笔刷中)时,BitmapImage会泄漏内存

我在带有SDK 7.1的模拟器和手机(HTC Titan)上看到了这一点 步骤:

  • 打开新的WP项目
  • 在App.xaml.cs中启动一个新的Dispatchermer,它每秒打印内存使用情况(DeviceStatus),并执行GC.Collect()。(考虑重新创建一个字节数组,其大小计算为略小于(MemoryUsageLimit-CurrentMemoryUsage))
  • 在ContentPanel中添加名为ImagePanel的StackPanel
  • 在ContentPanel中添加2个按钮(1个用于创建和添加10个图像 到带有代码的ImagePanel,一个用于清除ImagePanel的子级)
  • 找到一个高分辨率图像(这样内存使用就容易了 可见)并将其托管在本地IIS上
  • 单击按钮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 });
    }
    
    ImagePanel.Children.Clear();
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    
  • 尝试CreateOptions的所有变体,并观察内存中的差异。 继续添加和删除元素,并查看使用哪个CreateOption将获得OutOfMemoryException


    有人可以验证吗?

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

    如果将该值指定给同一BitmapImage对象,则不会出现问题。您确实需要在绘图线程上执行此操作,否则GDI将有一个合适的选项)
    就我个人而言,每当我在WP7中使用图像时,我都使用它来代替本机类。输出可以直接分配给图像控件,但可以异步加载,使用更少的内存,并且操作速度更快

    @atomaras-仅仅因为您要求它消失,并不意味着GC将实际执行此操作。这里没有泄漏。获取OutOfMemoryException不是一个很好的指示器,表明它不可收集吗?出于好奇,如果调用
    ImagePanel.Children.Clear
    via
    Dispatcher.BeginInvoke()
    ,会发生什么
    BackgroundCreation
    在后台创建新线程,在UI线程上清除它是否有帮助?(我没有测试代码,所以我假设存在内存泄漏)。我在我的一个应用程序中遇到了类似的行为。我必须手动将所有图像控件的源设置为null,以避免内存泄漏。