IsolatedStorage приводит к исчерпанию памяти - PullRequest
1 голос
/ 08 ноября 2010

эй.Я читаю изображение из изолированного хранилища, когда пользователь нажимает на такой элемент:не хватает памяти.Есть ли более эффективный способ чтения изображений из изолированного хранилища?Я мог бы кэшировать несколько изображений в памяти, но с сотнями результатов это все равно заняло бы память.Есть предложения?

1 Ответ

2 голосов
/ 08 ноября 2010

Вы выбрасываете MemoryStream в какой-то момент? Это единственная утечка, которую я смог найти.

Кроме того, Stream имеет метод CopyTo(). Ваш код может быть переписан как:

using (IsolatedStorageFile currentIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
    using (var img = currentIsolatedStorage.OpenFile(fileName, FileMode.Open))
    {
        var imgStream = new MemoryStream(img.Length);

        img.CopyTo(imgStream);

        return imgStream;
    }
}

Это сэкономит много много памяти.

EDIT:

А для Windows Phone (который не определяет CopyTo()), метод CopyTo() заменен на код:

using (IsolatedStorageFile currentIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
{
    using (var img = currentIsolatedStorage.OpenFile(fileName, FileMode.Open))
    {
        var imgStream = new MemoryStream(img.Length);

        var buffer = new byte[Math.Min(1024, img.Length)];
        int read;

        while ((read = img.Read(buffer, 0, buffer.Length)) != 0)
            imgStream.Write(buffer, 0, read);

        return imgStream;
    }
}

Основным отличием здесь является то, что буфер установлен относительно небольшим (1 КБ). Также добавлена ​​оптимизация, предоставив конструктору MemoryStream длину изображения. Это заставляет MemoryStream предварительно выделить необходимое пространство.

...