2

我有一个 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那么它会导致内存泄漏吗?

我在很多地方都有类似的代码,我可以观察到,一旦打开这个窗口并添加了控件,内存使用率就会像预期的那样变高,但即使在关闭这个窗口之后,内存也不会下降。

任何人都可以提供任何指示吗?

4

2 回答 2

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;

我应该补充一点,当缓存被禁用时,您可能会遇到性能下降的问题,尤其是在多次使用图像时。

于 2013-01-07T13:35:54.827 回答
1

当您关闭窗口时,无法保证资源将被释放。

在 .NET 中,只有在内存不足时才释放资源是一种习惯。这样可以节省时间。

您可以禁用 @Clemens 提到的缓存,但显然,由于缺少缓存,您可能会看到性能下降。

不要过早声称内存泄漏;你可能错了。测试它。

于 2013-01-07T13:43:54.150 回答