我正在创建照相亭应用程序。 它工作正常,但是当您使用一段时间后,程序开始变慢。我发现使用的内存有问题。
有时会创建一个页面,它会创建一个BitMap并绘制图像和悬停的模板的组合。 该图像需要显示在程序中,因此我将位图转换为BitmapSource以设置Controls.Image.Source
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有关,但我不使用它。
在将其设置为源之后,我尝试过将冻结方法与 BitmapSouce bs 一起使用,但是结果是相同的。
BitmapSource bs = ImageUtils.SourceFromBitmap(bi);
bs.Freeze();
canvas.Source = bs;
BitmapSource bs = ImageUtils.SourceFromBitmap(bi);
canvas.Source = bs;
bs.Freeze();
我还尝试在canvas.source重新分配之前使用GC.Collect(),但是结果是相同的。
我在关闭页面后尝试使用GC.Collect(),但结果是相同的。
解决内存泄漏的唯一方法是通过注释行,但这不是解决方案...
我该怎么办?