无法访问已关闭的流异常

时间:2016-08-12 16:46:45

标签: c# stream xamarin.android xamarin.forms memorystream

我试图"复制"来自另一个图像的图像,减小它的高度和宽度,并将其作为流返回以在另一个类中检索并显示为图像。但是当我在另一个类中获取流时,抛出异常; "无法访问封闭的流"。

此方法获取图像路径,缩小其大小并以流形式返回。

public Stream getImagenCopia (string dataImagen)
    {
        Bitmap ImageOrig = BitmapFactory.DecodeFile (dataImagen);
        var ImagenCopia = Bitmap.CreateScaledBitmap (ImageOrig, 80, 80, false);


        using (MemoryStream ms = new MemoryStream ())
        {
            ImagenCopia.Compress (Bitmap.CompressFormat.Jpeg, 40, ms);

            return ms;
        }
    }

此方法接收流并将其设置在图像源

var cim = auxFotos.getImagenCopia(path);
setImagen(img, cim);

void setImagen (Image img, Stream strm)
    {
        img.Source = ImageSource.FromStream (() =>
        {
            return strm;
        });
    }

1 个答案:

答案 0 :(得分:2)

您正在处置MemoryStream,因为您正在使用using阻止。当您稍后尝试在代码中使用返回值时,它将无法使用。

using (MemoryStream ms = new MemoryStream ())
{
    ImagenCopia.Compress (Bitmap.CompressFormat.Jpeg, 40, ms);

    return ms;
}

删除using声明:

Bitmap ImageOrig = BitmapFactory.DecodeFile(dataImagen);
var ImagenCopia = Bitmap.CreateScaledBitmap(ImageOrig, 80, 80, false);

var ms = new MemoryStream());
ImagenCopia.Compress(Bitmap.CompressFormat.Jpeg, 40, ms);
return ms;

如果由于资源没有被垃圾收集而导致内存消耗飙升,您可能需要在使用它后手动清理它,可能是通过调用它上面的.Dispose()。 / p>