从隔离存储加载文件的最佳方式

时间:2013-05-20 07:27:27

标签: c# windows-store-apps isolatedstorage

在我的Windows应用商店应用中,我在隔离存储中保存/使用文件(几乎是图像)。
当我需要呈现图像时,我使用以下内容:

var file = await folder.GetFileAsync(fileName);
using (var stream = await file.OpenAsync(FileAccessMode.Read))
{
    obj.Image = new BitmapImage();
    await obj.Image.SetSourceAsync(stream);
}

但是当我在同一页面中使用3个以上的图像时,我会有滞后。
我正在寻找更快的解决方案来访问隔离存储文件。

2 个答案:

答案 0 :(得分:0)

您可以尝试从这篇文章Optimize media resources (Windows Store apps using C#/VB/C++ and XAML)开始,并结合更多内容:

  1. 确保如果您在ListView / GridView中显示它们 - 您已启用虚拟化(您使用支持虚拟化的正确ItemsPanel)。

  2. 如果您只需要从本地存储加载图像 - 将绑定从Image.Source设置为正确的URI(ms-appx:///或ms-appdata:/// local /),并且图像控制将为您完成所有工作。

答案 1 :(得分:0)

我不知道您是如何打开多个图像的,但由于所有方法都是异步的,因此您不应该按顺序遍历文件,而是并行打开所有文件。

所以不要这样做(在开始加载下一个图像之前等待上一个图像加载):

foreach (var fileName in fileNames)
{
    var file = await folder.GetFileAsync(fileName);
    using (var stream = await file.OpenAsync(FileAccessMode.Read))
    {
        obj.Image = new BitmapImage();
        await obj.Image.SetSourceAsync(stream);
    }
}

你应该像这样接近它:

// not sure about the type of obj
public async Task<Image> LoadImage(string fileName, dynamic obj)
{
    var file = await folder.GetFileAsync(fileName);
    using (var stream = await file.OpenAsync(FileAccessMode.Read))
    {
        obj.Image = new BitmapImage();
        await obj.Image.SetSourceAsync(stream);
    }
}

var tasks = fileNames.Select(f => LoadImage(f, obj)).ToArray();
await Task.WhenAll(tasks);

这将初始化一组等待加载图像的等待任务,然后同时等待所有这些任务,以便它们并行执行。