awaitについて

awaitを含んだ処理の流れ
もともとの
同期コンテキスト
 別の
同期コンテキスト
(スレッドプール上)
await前
非同期処理実行 →非同期処理開始
await完了後の処理を登録 →
別の処理
await以後← 登録処理呼び出し非同期処理完了
別の処理

非同期メソッドの目印としては「async」がある。でもasyncは「メソッドの中にawaitがあるよ」という意味しかなく、非同期メソッドの中核は「await」で、awaitが含まれたメソッドを呼び出すと

  1. await前の行(とawaitの右側の式)を普通通り実行
  2. awaitする非同期処理の完了後の処理を登録
  3. メソッドから抜ける

と動作し、処理は呼び出し元に戻る。で、非同期処理が完了したら登録した「完了後の処理」が呼び出されて

  1. 非同期処理から結果を受け取る
  2. await後の処理を実行する

が行われる。

awaitから非同期処理の結果を受け取る

非同期処理の結果は値をくるんだTask(Task<T>)で返されるが、それを受け取ったawaitを値として評価すると、値をくるんだTask(Task<T>)から値Tを取り出してくれる。たとえば、Task<int>を返す非同期メソッド asyncIntの処理結果を変数resultに格納するには

int result = await asyncInt;

と書く。

参考ページ