web-dev-qa-db-ja.com

予期しないときにメソッドが呼び出されました

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

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

コードは単純です

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

私はWin8 devを初めて使用するので、明らかな何かが欠けている可能性があります。

編集(解決済み)コンソールアプリケーションを実行していますが、プログラムが非同期で実行されているため、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();
}
_
23
XSL

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

var files = await myStorageFolder.GetFilesAsync();

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

13
AndrewS

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

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

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

38
dcastro

次の命令に到達したときに操作がまだ実行されている可能性があるため、awaitvar 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
1
Mayank