我有一個應用程序(WPF)在龐大的數字(如25000)中創建BitmapImages。似乎框架使用了一些內部邏輯,所以在創建之後大約有300MB的內存消耗(150個虛擬和150個物理)。這些BitmapImages被添加到Image對象中,並被添加到Canvas中。問題是,當我釋放所有這些圖像時,內存沒有被釋放。我怎樣才能釋放內存?垃圾回收無法回收BitmapImage?
的應用是簡單的: 的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中的添加圖像後的屏幕截圖
「大約300 MB的內存消耗(150個虛擬和150個物理)」完全是BOGUS。閱讀內存。 – leppie
請勿使用GC.Collect(),但使用Bitmap.Dispose()。 –
你的電話'GC'不會在那裏做任何事情。假設「BitmapImage」對象沒有出色的根引用,CLR將在需要時回收內存。 – MoonKnight