设置图像源导致内存泄漏(wpf,c#)

时间:2019-05-07 13:14:01

标签: c# wpf image memory-leaks

我正在创建照相亭应用程序。 它工作正常,但是当您使用一段时间后,程序开始变慢。我发现使用的内存有问题。

场景:

有时会创建一个页面,它会创建一个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(),但结果是相同的。

解决内存泄漏的唯一方法是通过注释行,但这不是解决方案...

帮助:

我该怎么办?

0 个答案:

没有答案