私が取り組んでいる単純なasync
例があり、期待どおりに実行が呼び出し元に返されません。await
トップレベルのメソッドは次のとおりです。
protected async void MyDDL_SelectedIndexChanged(object sender, EventArgs e)
{
Task longRunningTask = LongRunningOperationAsync();
DoOtherStuff1();
DoOtherStuff2();
DoOtherStuff3();
await longRunningTask;
}
LongRunningOperationAsync
期待どおりに動作せず、同期的に実行されるメソッドを次に示します。
private async Task LongRunningOperationAsync()
{
var myValues = await GetStuffViaLongRunningTask();
//Code to work with myValues here...
}
の定義は次のとおりです。GetStuffViaLongRunningTask
private async Task<IList<MyClass>> GetStuffViaLongRunningTask()
{
//...Calls to get and build up IList<MyClass>
return results;
}
問題は、上記のコードが呼び出し元に戻らずDoOtherStuff1();
、期待どおりにメソッドの実行を開始しないことです。await Task.Delay(10000);
ただし、独自のメソッドを呼び出して、すべての単純な例が示すように呼び出しに置き換える代わりに、コードは期待どおりに機能します。
private async Task LongRunningOperationAsync()
{
//Returns to caller as expected:
await Task.Delay(10000);
}
上記のコードを使用している呼び出し元はlongRunningTask
、WaitingForActivation
ステータスが ではなく でありRanToCompletion
、まだ処理中であることを示しています。
私のGetStuffViaLongRunningTask()
方法は非常に速く実行され、結果が表示されないだけだと言うかもしれません。ただし、実行には常に 3 ~ 7 秒かかるため、デバッグ時に、呼び出しがブロックされ、同期されていることがわかります。
そのメソッド内で呼び出す単語LongRunningOperationAsync()
に到達したときに、への呼び出しが非同期に機能しないように、ここで間違って何をしていますか?await
LongRunningOperationAsync