2013-05-20 27 views
2

在我的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+我有滞后。
我正在寻找更快的解决方案来访问隔离的存储文件。

+0

您需要将代码旋转到单独的线程。你阻止了UI线程,这会给你带来的延迟。 –

回答

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 /)和Image控制会为你做所有事情。

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

所以不是这样(在这里你就等着前面的图像开始加载下一个之前加载)

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