1

おい。ユーザーが次のような項目をクリックすると、Isolated Storage から画像が読み取られます。

using (IsolatedStorageFile currentIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
{

    using (var img = currentIsolatedStorage.OpenFile(fileName, FileMode.Open))
    {

        byte[] buffer = new byte[img.Length];
        imgStream = new MemoryStream(buffer);
        //read the imagestream into the byte array
        int read;
        while ((read = img.Read(buffer, 0, buffer.Length)) > 0)
        {
            img.Write(buffer, 0, read);
        }

        img.Close();
    }


}

これは問題なく動作しますが、2 つの画像の間を行ったり来たりすると、メモリの消費量が増え続け、メモリが不足します。分離ストレージから画像を読み取るより効率的な方法はありますか? いくつかの画像をメモリにキャッシュすることはできますが、何百もの結果があると、とにかくメモリを占有してしまいます。助言がありますか?

4

1 に答える 1

2

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;
    }
}

これにより、多くのメモリ割り当てが節約されます。

編集:

また、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;
    }
}

ここでの主な違いは、バッファーが比較的小さく (1K) 設定されていることです。MemoryStreamまた、コンストラクターに画像の長さを提供することによる最適化を追加しました。これによりMemoryStream、必要なスペースが事前に割り当てられます。

于 2010-11-08T19:07:06.227 に答える