2

在我的 Windows Store 应用程序中,我在独立存储中保存/使用文件(几乎是图像)。
当我需要呈现图像时,我使用以下内容:

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

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

4

2 回答 2

0

您可以尝试从这篇文章优化媒体资源(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用程序)开始,以及更多内容:

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

  2. 如果您只需要从本地存储加载图像 - 将 Image.Source 的绑定设置为正确的 URI(ms-appx:/// 或 ms-appdata:///local/),图像控件将为你。

于 2013-05-20T22:55:35.027 回答
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);

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

于 2013-05-21T04:54:58.907 回答