0

GridApp テンプレートの DataSource として大量の画像を読み込もうとしています。再帰関数を使用してフォルダーをたどります。

public async void walk(StorageFolder folder)
    {
        IReadOnlyList<StorageFolder> subDirs = null;
        subDirs = await folder.GetFoldersAsync();
        foreach (var subDir in subDirs)
        {
            await SampleDataSource.AddGroupForFolderAsync(subDir.Path);
            walk(subDir);
        }
    }

そして、ここにコア機能があります:

public static async Task<bool> AddGroupForFolderAsync(string folderPath)
    {
        if (SampleDataSource.GetGroup(folderPath) != null) return false;
        StorageFolder fd = await StorageFolder.GetFolderFromPathAsync(folderPath);
        IReadOnlyList<StorageFile> fList1 = await fd.GetFilesAsync();
        List<StorageFile> fList2 = new List<StorageFile>();
        foreach (var file in fList1)
        {
            string ext = Path.GetExtension(file.Path).ToLower();
            if (ext == ".jpg" || ext == ".png" || ext == ".jpeg") fList2.Add(file);
        }
        if (fList2.Count != 0)
        {
            var folderGroup = new SampleDataGroup(
                uniqueId: folderPath,
                title: fd.Path,
                subtitle: null,
                imagePath: null,
                description: "Description goes here");
            foreach (var i in fList2)
            {
                StorageFile fl = await StorageFile.GetFileFromPathAsync(i.Path);
                IRandomAccessStream Stream = await fl.OpenAsync(FileAccessMode.Read);
                BitmapImage pict = new BitmapImage();
                pict.SetSource(Stream);
                if (pict != null && folderGroup.Image == null)
                {
                    folderGroup.SetImage(pict);
                }
                var dataItem = new SampleDataItem(
                    uniqueId: i.Path,
                    title: i.Path,
                    subtitle: null,
                    imagePath: pict,
                    description: "Decription goes here",
                    content: "Content goes here",
                    @group: folderGroup);
                folderGroup.Items.Add(dataItem);
            }
            AllGroups.Add(folderGroup);
            return true;
        }
        else { return false; }
    }

本当に大量のファイルをロードする必要があります (164 個のフォルダーと 1300 個を超えるファイル、全部で 500 MB)。後でこの金額が大きくなる可能性があります。IRandomAccessStream がファイルを RAM にロードするようです。HDDから直接アプリに画像をロードする方法は? Windows ストア アプリは可能ですか? まだ非同期で行うことは可能ですか?

コードのリファクタリングが必要であることを理解しています。書き直しを求めているわけではありません。この状況でメモリを節約する方法についてのアドバイスだけが必要です。

4

1 に答える 1

1

これらすべてのファイルをロードして、メモリ関連の問題に遭遇しないようにする方法はありません。ファイルの場所を読み込んでマッピングし、場合によっては、アプリケーションで表示できる画像のサムネイル バージョンを作成する必要があります。次に、実際に画像をロードする必要がある場合は、以前の画像をすべてアンロードして、実際に必要な画像をロードします。

画面にロードする次のファイルを検索する必要がある場合は、アプリケーションにキャッシュした場所を使用して画像をロードするだけです。

于 2013-05-01T17:58:49.343 に答える