Вы выбрасываете 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
предварительно выделить необходимое пространство.