Я создаю приложение Photobooth.Он работает нормально, но когда вы используете его некоторое время, программа начинает замедляться.Я обнаружил проблему с используемой памятью.
Сценарий:
В какой-то момент страница создается, и она создает BitMap и рисует композицию изображений и шаблон навески.Это изображение должно быть показано в программе, поэтому я преобразую растровое изображение в BitmapSource для установки Controls.Image.Source
Code:
Bitmap bi = new Bitmap(rect.Width, rect.Height);
Graphics g = Graphics.FromImage(bi);
[paint some stuff here]
BitmapSource bs = ImageUtils.SourceFromBitmap(bi);
canvas.Source = bs; //PROBLEM HERE
[Dispose g and bi]
Чтобы уточнить, используемые здесь методы:
public static BitmapSource SourceFromBitmap(Bitmap bmp)
{
var hbm = bmp.GetHbitmap();
try
{
BitmapSource result = Imaging.CreateBitmapSourceFromHBitmap(hbm, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
return result;
}
finally { DeleteObject(hbm);}
}
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);
Проблема
Первый тест, который я сделал, это прокомментировать строку canvas.Source = bs; , где canvas - это имя System.Windows.Controls.Image
Если я это сделаю, использование памяти не увеличится.
Пробовал
Я искал некоторую информацию, и большинство случаев это связано с BitmapImage, но я им не пользуюсь.
Я пытался использовать метод freeze с BitmapSouce bs после и до его установки в качестве источника, но результат тот же.
BitmapSource bs = ImageUtils.SourceFromBitmap(bi);
bs.Freeze();
canvas.Source = bs;
BitmapSource bs = ImageUtils.SourceFromBitmap(bi);
canvas.Source = bs;
bs.Freeze();
Я также пытался использовать GC.Collect () непосредственно перед переназначением canvas.source, но результат тот же.
Я пытался использовать GC.Collect () после закрытия страницы, но результат тот же.
Единственный способ устранить утечку памяти - этокомментируя строку, но это не решение ...
Справка:
Что я могу сделать?