使用时为什么会出现内存不足错误?

JMK*_*JMK 9 c# memorystream using

我有以下方法,将a转换BitmapImageSystem.Drawing.Bitmap:

public static Bitmap BitmapImageToBitmap(BitmapImage bitmapImage)
{
    Bitmap bitmap;

    using (var ms = new MemoryStream())
    {
        var encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(bitmapImage));
        encoder.Save(ms);

        bitmap = new Bitmap(ms);
    }

    return bitmap;
}
Run Code Online (Sandbox Code Playgroud)

每当我尝试使用返回的Bitmap对象时,我都会收到以下错误:

发生OutOfMemoryException - 内存不足.

但是,每当我用这个替换代码时:

public static Bitmap BitmapImageToBitmap(BitmapImage bitmapImage)
{
    var ms = new MemoryStream();

    var encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(bitmapImage));

    encoder.Save(ms);

    return new Bitmap(ms);
}
Run Code Online (Sandbox Code Playgroud)

这很好用.不过,我敢肯定,我应该用作为MemoryStream对象实现IDisposable.这里发生了什么?

Tig*_*ran 11

Bitmap的构造函数Bitmap Constructor(Stream)声称

您必须在Bitmap的生命周期内保持流打开.

在您的情况下,当您使用using语句时,流(即Disposable)会自动处理,因此您的Bitmap对象将变为无效.这并不是说你分配了太多的内存,而是关于那个位图指向不再存在的东西.