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 ストア アプリは可能ですか? まだ非同期で行うことは可能ですか?
コードのリファクタリングが必要であることを理解しています。書き直しを求めているわけではありません。この状況でメモリを節約する方法についてのアドバイスだけが必要です。