Почему я получаю 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 прокручивается

Какие'не так с этим примером кода?

Почему память не освобождается (достаточно быстро)?

Ответы на вопрос(3)

Ваш ответ на вопрос