1

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

この問題を解決するにはどうすればよいですか?

4

2 に答える 2

5

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));
于 2012-09-26T16:32:44.957 に答える
0

GetItemsAsync() の結果に対してすぐにではなく、Completed ハンドラーから GetResults を呼び出す必要があると思います。

于 2012-09-26T16:35:03.660 に答える