C # WPF BitmapSource Memory Leak?

Я разрабатываю программу для блэкджека, которая показывает стол для блэкджека, карты и т. Д. Планируется, что она будет играть тысячи раздач одну за другой с использованием автоматизированной стратегии.

У меня есть UserControl PlayerSeat, который содержит ItemsControl, привязанный к ObservableCollection. Этот класс CardInHand содержит BitmapSource с именем CardImage. Когда экземпляр помещен в ящик, он загружает изображение карты из ресурсов, используя следующий код:

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);

private BitmapSource GenerateCardImage() {
        Stream TempStream = this.GetType().Assembly.GetManifestResourceStream("BlackJack.Resources.CardImages.Card_" + m_Card.ShortTitle + ".gif");
        System.Drawing.Bitmap sourceBMP = new System.Drawing.Bitmap(TempStream);
        BitmapSource tempBitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
            sourceBMP.GetHbitmap(),
            IntPtr.Zero,
            System.Windows.Int32Rect.Empty,
            BitmapSizeOptions.FromWidthAndHeight(sourceBMP.Width, sourceBMP.Height)
        );
        TempStream.Dispose();
        DeleteObject(sourceBMP.GetHbitmap());
        return tempBitmapSource;
}

Проблема в том, что после прохождения ~ 500 раундов (~ 4000 рук или ~ 10000 карт) я получаю ошибку GDI + и приложение занимая ~ 400 МБ ОЗУ. Он быстро растет и зависит от количества сыгранных рук.

DeleteObject () - это то, что я нашел на другом сайте, где сказано, что это лучший способ высвободить ресурсы из Bitmap. Это МОЖЕТ иметь небольшой эффект, но не то, что я ищу. Я также пробовал Dispose ().

Другой сайт сказал, что это связано с привязкой ItemsSource. Убрал привязку и память все равно выросла. Я, наоборот, оставил привязку и удалил код, генерирующий растровое изображение. Он сыграл 40 000 раундов и существенно не вырос (возможно, + 20 МБ за 40 минут работы).

ObservableCollection очищается () после каждого раунда. Я попытался обнулить коллекцию, свойства CardInHand и BitmapSource, но безрезультатно.

Как я могу разрешить отображение этих изображений на экране, а также убедиться, что их объекты надлежащим образом уничтожены после того, как они больше не нужны ?

Спасибо за ваше время.

5
задан Caesar Kabalan 28 August 2011 в 02:47
поделиться