Почему я получаю OutOfMemoryException, когда у меня есть изображения в моем ListBox?
Я хочу отобразить все изображения, хранящиеся в папке фотографий Windows Phone 8, в моей пользовательской галерее, которая используетListBox
для отображения изображений.
ListBox
код выглядит следующим образом:
Со следующим конвертером:
public class PreviewPictureConverter : System.Windows.Data.IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
PreviewImageItem c = value as PreviewImageItem;
if (c == null)
return null;
return c.ImageData;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Изображения хранятся в пользовательском классе:
class PreviewImageItem
{
public Picture _picture = null;
public BitmapImage _bitmap = null;
public PreviewImageItem(Picture pic)
{
_picture = pic;
}
public BitmapImage ImageData
{
get
{
System.Diagnostics.Debug.WriteLine("Get picture " + _picture.ToString());
_bitmap = new BitmapImage();
Stream data = _picture.GetImage();
try
{
_bitmap.SetSource(data); // Out-of memory exception (see text)
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("Exception : " + ex.ToString());
}
finally
{
data.Close();
data.Dispose();
data = null;
}
return _bitmap;
}
}
}
Следующий код используется для установкиListBox
источник данных:
private List _galleryImages = new List();
using (MediaLibrary library = new MediaLibrary())
{
PictureCollection galleryPics = library.Pictures;
foreach (Picture pic in galleryPics)
{
_galleryImages.Add(new PreviewImageItem(pic));
}
previewImageListbox.ItemsSource = _galleryImages;
};
Наконец то "зачистка» код:
private void VirtualizingStackPanel_CleanUpVirtualizedItemEvent_1(object sender, CleanUpVirtualizedItemEventArgs e)
{
PreviewImageItem item = e.Value as PreviewImageItem;
if (item != null)
{
System.Diagnostics.Debug.WriteLine("Cleanup");
item._bitmap = null;
}
}
Все это работает нормально, но код падает сOutOfMemoryException
после нескольких изображений (особенно при быстрой прокрутке). МетодVirtualizingStackPanel_CleanUpVirtualizedItemEvent_1
называется регулярным (например, каждые 2 или 3 записи списка), когдаListBox
прокручивается
Какие'не так с этим примером кода?
Почему память не освобождается (достаточно быстро)?