当CreateOptions是任何东西时,BitmapImage会泄漏内存但是DelayCreation AND放在可视化树中(在Image或ImageBrush中)
我在SDK 7.1和电话(HTC Titan)的仿真器上看到了这个 步骤:
单击按钮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 });
}
单击按钮2时,写下:
ImagePanel.Children.Clear();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
尝试使用CreateOptions的所有变体并观察内存的差异。 继续添加和删除元素,并查看您将获得OutOfMemoryException的CreateOption。
有人可以验证吗?
答案 0 :(得分:0)
这种预期的行为是不是因为BitmapImage依赖于GDI +? (因此基本上是非托管代码?)IIRC不是ImagePanel泄漏,而是一遍又一遍地创建BitmapImage。
如果将值分配给同一个BitmapImage对象,则不应出现问题。你需要在绘图线程上执行此操作,否则GDI将适合) 就个人而言,每当我在WP7中使用图像时,我都使用ImageTools而不是本机类。输出可以直接分配给图像控件,但可以异步加载,使用更少的内存,操作速度更快