【问题标题】:How to retrieve files from KnowFolders in Windows 8?如何从 Windows 8 中的 KnowFolders 中检索文件?
【发布时间】:2016-12-25 23:35:52
【问题描述】:

我想创建方法来获取 PictureFolder 中的文件列表。 我创建了这个方法:

public Task<List<string>> GetImages()
{
var task = new Task<List<string>>(() =>
{
var files = new List<string>(5);
StorageFolder picturesFolder = KnownFolders.PicturesLibrary;
IReadOnlyList<IStorageItem> itemsList = picturesFolder.GetItemsAsync().GetResults();
foreach(var item in itemsList)
{
if(item is StorageFile)
{
files.Add(item.Name);
}
}
return files;

});
return task;
}

以及我用于测试此方法的代码:

 var pic = new PictureManager();
pic.GetImages().RunSynchronously();
List<string> images = pic.GetImages().Result;
bool hasValue = images.Count > 0;
Debug.WriteLine(string.Format("Has value {0}", hasValue));

我得到了这个异常

System.InvalidOperationException was unhandled by user code
  HResult=-2147483634
  Message=A method was called at an unexpected time. (Exception from HRESULT: 0x8000000E)
  Source=Windows.Foundation
  StackTrace:
       at Windows.Foundation.IAsyncOperation`1.GetResults()
       at Praktyka.Models.PictureManager.<GetImages>b__0() in d:\Documents\Visual Studio 2012\Projects\Praktyka\Praktyka\Models\PictureManager.cs:line 63
       at System.Threading.Tasks.Task`1.InnerInvoke()
       at System.Threading.Tasks.Task.Execute()
  InnerException: 

在这一行(方法GetImages)

 IReadOnlyList<IStorageItem> itemsList = picturesFolder.GetItemsAsync().GetResults();

如何解决这个问题?

【问题讨论】:

    标签: c# windows-8 .net-4.5 async-await


    【解决方案1】:

    RunSynchronously 方法在当前线程上启动一个任务。但是,从 GetItemsAsync 返回的任务已经启动,因此您会收到异常。

    您需要重构代码以利用 async/await 关键字:

    public async Task<List<string>> GetImages()
    {
     var files = new List<string>();
     StorageFolder picturesFolder = KnownFolders.PicturesLibrary;
     IReadOnlyList<IStorageItem> itemsList = await picturesFolder.GetItemsAsync();
     foreach(var item in itemsList)
     {
      if(item is StorageFile)
      {
       files.Add(item.Name);
      }
     }
    return files;
    }
    

    同样,调用 GetImages 的方法应该利用 await:

    var pic = new PictureManager();
    List<string> images = await pic.GetImages();;
    bool hasValue = images.Count > 0;
    Debug.WriteLine(string.Format("Has value {0}", hasValue));
    

    【讨论】:

      【解决方案2】:

      我相信您应该从 Completed 处理程序调用 GetResults,而不是立即调用 GetItemsAsync() 的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-13
        • 1970-01-01
        • 1970-01-01
        • 2010-12-14
        相关资源
        最近更新 更多