我有一个WPF应用程序,我在运行时向窗口添加控件,如下面的代码所示:
tempImg = new System.Windows.Controls.Image();
tempImg.Width = 65;
tempImg.Source = new BitmapImage(new Uri("pack://application:,,,/Imagesic_web_64h.png"));
tempImg.Tag = text;
tempImg.ToolTip = text;
presenter.webLinks.Add(text);
ExtraContent.Items.Add(tempImg);
在上面的代码中,ExtraContent是listbox
。我的问题是,如果我将上述内容保留在循环中以向listbox
添加多个图像控件,那么会导致内存泄漏吗?
我在很多地方都有类似的代码,我可以看到,一旦打开这个窗口并添加了控件,内存使用量就会高,正如预期的那样,但即使关闭此窗口后内存也不会降低。< / p>
任何人都可以提供任何指示吗?
答案 0 :(得分:2)
观察到的行为可能是因为WPF在内存中缓存了BitmapImages。我猜你可以通过在加载图片时设置BitmapcacheOption.None标志来禁用缓存:
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.None;
bitmapImage.UriSource = new Uri("pack://application:,,,/Imagesic_web_64h.png");
bitmapImage.EndInit();
tempImg.Source = bitmapImage;
我应该补充一点,当禁用缓存时,您可能会遇到性能下降的问题,尤其是在多次使用图像时。
答案 1 :(得分:1)
当您关闭窗口时,没有保证资源将被释放。
在.NET中,只有在内存不足时才能自定义资源。这样可以节省时间。
你可以像@Clemens所提到的那样禁用缓存,但很明显,由于缺少缓存,你可能会看到性能下降。
不要过早要求记忆漏洞;你可能错了。测试它。