gpt4 book ai didi

c# - 内存未在 WPF Image 中释放

转载 作者:太空宇宙 更新时间:2023-11-03 17:31:19 30 4
gpt4 key购买 nike

我正在 Canvas 中加载和卸载图像。我使用下面的代码加载了 Image

在加载我的 Image 之前,内存消耗是 14.8MB。

Canvas c = new Canvas();

Image im = new Image();
ImageSource src = new BitmapImage(new Uri(@"E:Capture.png"));
im.Source = src;
im.Height = 800;
im.Width = 800;

c.Children.Add(im);
homegrid.Children.Add(c); //homegrid is my grid's name

Image 正确显示,现在内存消耗为 20.8MB。然后我通过下面的代码卸载了 Image:

foreach (UIElement element in homegrid.Children)
{
if (element is Canvas)
{
Canvas page = element as Canvas;

if (page.Children.Count > 0)
{
for (int i = page.Children.Count - 1; i >= 0; i--)
{
if (page.Children[i] is Image)
(page.Children[i] as Image).Source = null;
page.Children.RemoveAt(i);
}
}

page.Children.Clear();
page = null;
}
}

homegrid.Children.RemoveAt(2);
InvalidateVisual();

此后 Image 被删除,但内存仍然是 20.8 MB。

谁能帮我解决这个问题?

最佳答案

首先,您应该通过显式调用 GC.Collect() 来进行测试以收集内存并查看内存是否释放,因为 GC 收集是不确定的。您无法确定在您的方法执行后 GC 运行并回收内存。

因此,最后将此代码明确强制运行 GC 以检查是否实际释放了内存:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

但是,在创建BitmapImage 时存在一些已知的内存泄漏问题,您可以引用here , herehere .

实际上,WPF 在幕后保持静态 BitmapImage 和 Image 之间的强引用,并在 Bitmap 图像上 Hook 一些事件。因此,您应该在分配给图像之前卡住 bitmapImage。 WPF 不会在卡住的位图图像上 Hook 事件。同时设置 CacheOption 以避免 bitmapImage 的任何缓存内存泄漏。

Image im = new Image();    
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.UriSource = new Uri(@"E:Capture.png");
bi.EndInit();
bi.Freeze();
ImageSource src = bi;
im.Source = src;
im.Height = 800;
im.Width = 800;

关于c# - 内存未在 WPF Image 中释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21877221/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com