gpt4 book ai didi

c# - 垃圾回收失败回收BitmapImage?

转载 作者:太空狗 更新时间:2023-10-29 20:05:36 26 4
gpt4 key购买 nike

我有一个应用程序 (WPF),它创建了大量的 BitmapImages(比如 25000)。似乎框架使用了一些内部逻辑,因此在创建后消耗了大约 300 MB 的内存(150 虚拟内存和 150 物理内存)。这些 BitmapImages 被添加到 Image 对象中,然后被添加到 Canvas 中。问题是当我释放所有这些图像时,内存没有被释放。我怎样才能释放内存?

应用很简单:Xaml

    <Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Canvas x:Name="canvas" Grid.ColumnSpan="2"></Canvas>
<Button Content="Add" Grid.Row="1" Click="Button_Click"/>
<Button Content="Remove" Grid.Row="1" Grid.Column="1" Click="Remove_click"/>
</Grid>

代码隐藏

        const int size = 25000;
BitmapImage[] bimages = new BitmapImage[size];
private void Button_Click(object sender, RoutedEventArgs e)
{
var paths = Directory.GetFiles(@"C:\Images", "*.jpg");
for (int i = 0; i < size; i++)
{
bimages[i] = new BitmapImage(new Uri(paths[i % paths.Length]));
var image = new Image();
image.Source = bimages[i];
canvas.Children.Add(image);
Canvas.SetLeft(image, i*10);
Canvas.SetTop(image, i * 10);
}
}

private void Remove_click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < size; i++)
{
bimages[i] = null;
}
canvas.Children.Clear();
bimages = null;
GC.Collect();
GC.Collect();
GC.Collect();
}

这是添加图片后ResourceManager的截图 enter image description here

最佳答案

Wpf 中有一个 bug,我们被 BitmapImage 对象咬伤,除非你卡住它们。 https://www.jawahar.tech/home/finding-memory-leaks-in-wpf-based-applications是我们发现问题的原始页面。它应该在 Wpf 3.5 sp1 中得到修复,但在某些情况下我们仍然会看到它。尝试像这样更改您的代码,看看是否是问题所在:

bimages[i] = new BitmapImage(new Uri(paths[i % paths.Length]));
bimages[i].Freeze();

我们现在经常卡住我们的 BitmapImage 对象,因为我们在探查器中看到其他实例,其中 Wpf 正在监听 BitmapImage 上的事件,从而使图像保持事件状态。

如果 Feeze() 调用不是您代码的明显修复方法,我强烈建议您使用诸如 RedGate Memory Profiler 之类的分析器 - 它将跟踪一个依赖关系树,该树将向您展示是什么让您的代码保持不变内存中的图像对象。

关于c# - 垃圾回收失败回收BitmapImage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11202807/

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