Исключение нехватки памяти в WP7

Когда я пытаюсь сохранить некоторые изображения в моем изолированном хранилище, возникает исключение Out of Memory. Если количество изображений больше 20, возникает эта ошибка. Я загружаю все эти изображения и сохраняю их во временной папке в изолированном хранилище. Когда я пытаюсь сохранить эти изображения из временной папки в папку с именем myImages в изолированном хранилище, возникает эта ошибка. Каждая фотография считывается из temp и записывается в myImages одну за другой. Эта ошибка возникает, когда в myImages сохраняется около 20 или 25 фотографий. Изображения имеют средний размер 350-400 КБ. Как мне избежать этой ошибки?

Мой код:

private void SaveImages(int imageCount)
{
    IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
    BitmapImage bitmap;
    string tempfoldername = "Temp";
    string tempfilename = string.Empty;

    string folderName = "myImages";
    string imageName = string.Empty;
    for (int i = 0; i < imageCount; i++)
    {
        tempfilename = tempfoldername + "\\" + (i + 1) + ".jpg";
        bitmap = GetImage(tempfoldername, tempfilename);

        imageName = folderName + "\\" + (i + 1) + ".jpg";
        SaveImage(bitmap, imageName, folderName);
        if (isf.FileExists(imageName))
            isf.DeleteFile(imageName);

        bitmap = null;
    }
}
private BitmapImage GetImage(string foldername, string imageName)
{
    IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
    IsolatedStorageFileStream isfs;
    BitmapImage bi = new BitmapImage();
    MemoryStream ms = new MemoryStream();
    byte[] data;
    int FileSize = 0;
    if (isf.DirectoryExists(foldername))
    {
        isfs = isf.OpenFile(imageName, FileMode.Open, FileAccess.Read);
        data = new byte[isfs.Length];
        isfs.Read(data, 0, data.Length);
        ms.Write(data, 0, data.Length);
        FileSize = data.Length;
        isfs.Close();
        isfs.Dispose();
        bi.SetSource(ms);
        ms.Dispose();
        ms.Close();
        return bi;
    }
    return null;
}

private void SaveImage(BitmapImage bitmap, string imageName, string folderName)
{
    int orientation = 0;
    int quality = 100;
    using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
    {
        if (!isf.DirectoryExists(folderName))
            isf.CreateDirectory(folderName);

        if (isf.FileExists(imageName))
            isf.DeleteFile(imageName);

        Stream fileStream = isf.CreateFile(imageName);
        WriteableBitmap wb = new WriteableBitmap(bi);
        wb.SaveJpeg(fileStream, wb.PixelWidth, wb.PixelHeight, orientation, quality);
        fileStream.Close();
    }
}

как я могу исправить эту ошибку?


person Nelson T Joseph    schedule 04.09.2012    source источник


Ответы (1)


Скорее всего, у вашего BitmapImage происходит утечка памяти.
Убедитесь, что для UriSource установлено значение null, чтобы освободить память.

Взгляните на http://blogs.msdn.com/b/swick/archive/2011/04/07/image-tips-for-windows-phone-7.aspx, чтобы узнать больше.

person Matt Lacey    schedule 04.09.2012