Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2010, 18:43   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию WPF / Image.Source Memory Leaks

Приветствую.

Вообщем сразу к делу, у меня приложение WPF, нужно было сделать Image который бы грузил картинку с интернета, просто указав ему URL (знаю что можно просто BitmapImage(new Uri)..., но я добавил еще и прогресс бар на картинку, ну на свой UserControl). Теперь к делу, у меня часто обновляется список этих картинок (моего контрола), т.е. я полностью удаляю с дерева и вставляю новые с новыми URL на картинки. Провел исследование, пишут мол это баг, надо просто сделать Image.Source = null; и GC освободит уже не нужную картинку из памяти. Но дело в том, что я точно всем ставлю null, но спустя время программа начинает явно терять из виду память (утечки).

В своем классе сделал типа Counter'a, который мне в консоле (дебаге) показывает сколько картинок программа имеет, у меня всегда возвращается к 0, т.е. ниодной картинки нет, а это значит всем Image'ам было присвоено Source = null; но память так и остается висет. Явно утечка.

Если попросту не загружать в Source полученный из нета BitmapImage, то никаких утечек.

Кто сталкивался, или есть какие идеи, прошу помощи?!

Примерчик с использованием WebClient'a
Код:
private void WebClient_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
        {
            try
            {
                if ((e.Error == null) && !e.Cancelled)
                {
                    var ms = new MemoryStream(e.Result);

                    var bmp = new BitmapImage();
                    bmp.BeginInit();
                    bmp.StreamSource = ms;
                    bmp.CacheOption = BitmapCacheOption.OnLoad;
                    bmp.CreateOptions = BitmapCreateOptions.None;
                    bmp.EndInit();
                    bmp.Freeze();

                    if (!IsDisposed)
                    {
                        Image.Source = bmp;
                        Counter++;
                        Added = true;
                    }

                    bmp = null;
                    ms = null;
                }
            }
            finally
            {
                WaitAnimation.IsAnimationEnabled = false;
                WaitAnimation.Visibility = Visibility.Hidden;
            }
        }

        #region IDisposable Members

        static int Counter = 0;
        bool Added = false;

        public void Dispose()
        {
            IsDisposed = true;
            Image.Source = null;
            if (Added)
            {
                Counter--;
                Console.WriteLine("IMAGE COUNTER: {0}", Counter);
            }
        }

        #endregion
BOBAH13 вне форума Ответить с цитированием
Старый 16.10.2010, 00:06   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Как бы это прискорбно не звучало, вся кривость в .NET Framework 3.5 sp1, запустил в 4ом все чистится, плюс некоторые другие грабли убрал, которые ставил в 3.5, теперь работает логично

p.s. как обычно монолог, что тоже прискорбно для форума программистов.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C# + WPF] Отлов нажатий клавиш, хуки, горячие клавиши в проекте WPF Casper-SC WPF, UWP, WinRT, XAML 3 03.03.2017 15:00
класс Screen в WPF. Есть ли такой? [?] Не добавлять же сборку Forms в WPF Casper-SC Общие вопросы .NET 2 30.07.2010 15:10
проблема с binding source и update Vitamin125 Общие вопросы .NET 0 20.05.2010 15:38
CryENGINE2 и Valve Source Engine Aries Свободное общение 4 16.02.2010 18:21
Source Engine / VC++ / 3000WMR AXiuS7 Фриланс 4 20.03.2009 14:13