Garbage Collection kann BitmapImage nicht wiederherstellen?
Ich habe eine Anwendung (WPF), die BitmapImages in großen Zahlen (wie 25000) erstellt. Das Framework scheint eine interne Logik zu verwenden, sodass nach der Erstellung ca. 300 MB Speicher verbraucht werden (150 virtuelle und 150 physische). Diese Bitmap-Bilder werden dem Bildobjekt und dem Canvas-Bereich hinzugefügt. Das Problem ist, dass wenn ich all diese Bilder freigebe, der Speicher nicht freigegeben wird. Wie kann ich Speicher freigeben?
Die Anwendung ist einfach: 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>
Code-Behind
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();
}
Dies ist ein Screenshot von ResourceManager nach dem Hinzufügen von Bildern