当我使用Stream时,UWP应用程序使用太多内存

时间:2017-09-16 14:14:46

标签: stream uwp out-of-memory

我创建了一个应用程序来读取ZipArchive(100+照片),并使用Stream,MemoryStream,IRandomAccessStream和BinaryReader来读取bitmapImage的setSource。

private byte[] GetBytes(ZipArchiveEntry entity)
    {
        Stream stream = entity.Open();
        MemoryStream ms = new MemoryStream();
        BinaryReader reader = null;
        byte[] imageData = null;
        try
        {
            stream.CopyTo(ms);
            imageData = new byte[ms.Length];
            string fileclass = "";
            reader = new BinaryReader(ms);
            ms.Seek(0, 0);
            imageData = reader.ReadBytes((int)ms.Length);
            //Verify png jpg bmp
            some code and return imageData
            //throw exception,return null
            else
            {
                throw new Exception();
            }
        }
        catch (Exception ex)
        {
            return null;
        }
        //Dispose
    }

BitmapImage.SetSource by byte[]

public async Task<MangaPageEntity> GetImageFromZipArchiveEntry(ZipArchiveEntry entity, int index)
    {
        MangaPageEntity mpe = new MangaPageEntity();
        mpe.Index = index;
        IRandomAccessStream iras = null;
        try
        {
            byte[] data = GetBytes(entity);
            iras = data.AsBuffer().AsStream().AsRandomAccessStream();
            iras.Seek(0);
            await mpe.Picture.SetSourceAsync(iras);
        }//catch and dispose
        return mpe;

通过这种方式,它在手机上也运行了太多内存..

1 个答案:

答案 0 :(得分:1)

尝试将您的流和其他 IDisposable 放入using statement

private byte[] GetBytes(ZipArchiveEntry entity)
{
    using (Stream stream = entity.Open())
    using (MemoryStream ms = new MemoryStream())
    {
        byte[] imageData = null;
        try
        {
            stream.CopyTo(ms);
            imageData = new byte[ms.Length];
            string fileclass = "";
            using (BinaryReader reader = new BinaryReader(ms))
            {
                ms.Seek(0, 0);
                imageData = reader.ReadBytes((int)ms.Length);
            }              
            //Verify png jpg bmp some code and return imageData
            //throw exception,return null
            else
            {
                throw new Exception();
            }
        }
        catch (Exception ex)
        {
            return null;
        }
    }
    //Dispose
}

public async Task<MangaPageEntity> GetImageFromZipArchiveEntry(ZipArchiveEntry entity, int index)
{
    MangaPageEntity mpe = new MangaPageEntity();
    mpe.Index = index;
    try
    {
        byte[] data = GetBytes(entity);
        using (IRandomAccessStream iras = data.AsBuffer().AsStream().AsRandomAccessStream())
        {
            iras.Seek(0);
            await mpe.Picture.SetSourceAsync(iras);
        }
    }//catch and dispose
    return mpe;
}

当您的代码使用时,它会调用 Dispose()。还需要阅读更多内容:Uses of “using” in C#What is the C# Using block and why should I use it?以及其他内容。