awaitを含んだ処理の流れ
もともとの 同期コンテキスト | 別の 同期コンテキスト (スレッドプール上) |
||
---|---|---|---|
await前 | |||
非同期処理実行 → | 非同期処理開始 | ||
await | 完了後の処理を登録 → | ↓ | |
別の処理 | |||
await以後 | ← 登録処理呼び出し | 非同期処理完了 | |
別の処理 |
非同期メソッドの目印としては「async」がある。でもasyncは「メソッドの中にawaitがあるよ」という意味しかなく、非同期メソッドの中核は「await」で、awaitが含まれたメソッドを呼び出すと
- await前の行(とawaitの右側の式)を普通通り実行
- awaitする非同期処理の完了後の処理を登録
- メソッドから抜ける
と動作し、処理は呼び出し元に戻る。で、非同期処理が完了したら登録した「完了後の処理」が呼び出されて
- 非同期処理から結果を受け取る
- await後の処理を実行する
が行われる。
awaitから非同期処理の結果を受け取る
非同期処理の結果は値をくるんだTask(Task<T>)で返されるが、それを受け取ったawaitを値として評価すると、値をくるんだTask(Task<T>)から値Tを取り出してくれる。たとえば、Task<int>を返す非同期メソッド asyncIntの処理結果を変数resultに格納するには
int result = await asyncInt;
と書く。