Ich habe eine Anwendung (WPF), die BitmapImages in großen Zahlen (wie 25000) erstellt. Scheint wie Framework verwendet einige interne Logik, so nach der Erstellung sind ca. 300 MB Speicher verbraucht (150 virtuelle und 150 physikalische). Diese BitmapImages werden dem Image-Objekt hinzugefügt und in Canvas hinzugefügt. Das Problem ist, dass wenn ich all diese Bilder freigebe, der Speicher nicht freigegeben wird. Wie kann ich den Speicher freigeben?Garbage Collection kann BitmapImage nicht zurückgewinnen?
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 Bilder
"ca. 300 MB Speicher verbraucht (150 virtuelle und 150 physikalische)" das ist total BOGUS. Lesen Sie im Speicher nach. – leppie
Verwenden Sie nicht GC.Collect(), sondern Bitmap.Dispose(). –
Ihr Anruf der 'GC' wird dort nichts tun. Angenommen, es gibt keine ausstehenden Verwurzelungsreferenzen für die "BitmapImage" -Objekte, wird die CLR den Speicher zurückfordern, wenn sie benötigt wird. – MoonKnight