Ho un'applicazione (WPF) che crea BitmapImages in numeri enormi (come 25000). Sembra che il framework usi una logica interna, quindi dopo la creazione ci sono circa 300 mb di memoria consumata (150 virtuali e 150 fisici). Questi BitmapImages vengono aggiunti nell'oggetto Immagine e vengono aggiunti a Canvas. Il problema è che quando rilascio tutte quelle immagini la memoria non viene liberata. Come posso liberare la memoria?Garbage Collection non riesce a reclamare BitmapImage?
L'applicazione è semplice: 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>
codice sottostante
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();
}
Questa è una schermata di ResourceManager dopo aggiungere immagini
"circa 300 MB di memoria consumata (150 virtuali e 150 fisici)" che è totalmente BOGUS. Leggi sulla memoria. – leppie
Non utilizzare GC.Collect(), ma Bitmap.Dispose(). –
La tua chiamata 'GC' non farà nulla lì. Supponendo che non ci siano riferimenti radicati in sospeso per gli oggetti 'BitmapImage', il CLR recupererà la memoria quando ne ha bisogno. – MoonKnight