23

GetFilesAsync を使用してディレクトリ内のすべてのファイルを反復処理しようとしていますが、GetResults メソッドを呼び出すたびに、例外がスローされます。

System.InvalidOperationException: 予期しない時間にメソッドが呼び出されました

コードは単純です

var files = myStorageFolder.GetFilesAsync(); //runs fine
var results = files.GetResults(); //throws the exception

私はWin 8開発に慣れていないので、明らかな何かが欠けている可能性があります。

編集 (解決済み) コンソール アプリケーションを実行していますが、プログラムが非同期で実行されるようになったため、files.GetResult()メソッドは存在しなくなりました。

static void Main(string[] args)
{
   var files = GetFiles(myStorageFolder);
   var results = files.GetAwaiter().GetResults();//Need to add GetAwaiter()
}

static async Task GetFiles(StorageFolder sf)
{
   await sf.GetFilesAsync();
}
4

4 に答える 4

39

キーワードを使用したくないasync場合 (私の場合、コードはプロパティ内にあっasyncたため、オプションではありませんでした)、TaskAwaiter次の 2 つのメソッドをチェーンすることで、代わりにa を使用できます。

var folder = Package.Current.InstalledLocation.GetFolderAsync("folderName").GetAwaiter().GetResult();

InvalidOperationExceptionこれにより、デッドロックが発生したり、スローされたりすることはありません。

于 2013-09-21T16:23:27.417 に答える
13

非同期メソッドが完了するまで待つ必要があります。したがって、新しい await を 1 つのオプションとして使用できます。

var files = await myStorageFolder.GetFilesAsync();

ここで非同期メソッドの処理に関するドキュメントを確認することをお勧めします。

于 2012-10-27T01:31:26.620 に答える
1

次の命令に到達したときに操作がまだ実行されている可能性があるため、必要がawaitありますvar files = myStorageFolder.GetFilesAsync();var results = files.GetResults(); //throws the exception

var files = await myStorageFolder.GetFilesAsync(); //runs fine
var results = files.GetResults(); //this will run when call above returns
于 2012-10-27T01:31:44.717 に答える