asyncで宣言された非同期メソッドの戻り型がTaskまたはTask< TResult>である場合。それは待つことができます。メソッド内ではC#コードでタスクは返されませんが、Task< TResult> TResultの値例えば:
private static async Task<int> AsyncDemo()
{
await Task.Delay(1000);
return 1;
}
結果のILコードは、コンパイルされたステートマシンを起動したAsyncTaskMethodBuilderのタスクを返します。私の質問は、このタスクが実際に何を表しているのかということです。スレッドではなく、ステートマシンの実行を表すタスクだと思います。また、ステートマシンが終了したときにタスクが完了したか、例外が発生したときにFaulted状態に設定されたとします。説明をお願いします。
タスクは概念的にメソッドを表します。
メソッドが戻ると、タスクは(正常に)完了し、結果はメソッドから返された値に設定されます(該当する場合)。メソッドが例外をスローした場合、タスクは失敗します(エラーで完了します)。特別な場合がありますOperationCanceledException
:その場合、タスクは取り消されます(取り消されて完了します)。
技術的には、タスクはステートマシンを表します。これはメソッドの書き換えです。しかし、ステートマシンは隠されているため、タスクは概念的にメソッド自体を表します。