質問: 0; } } } private async Task GetintValue() { a++; await Task.Delay(100); return a; } ```
回答: まず第一にawaitに関する理解は大体は良いと思います。 通常は、実行後に元のスレッドに戻して処理を継続です。 しかし、awaitは別のスレッドを作ったりはしません。 他のスレッドで動かしたいなら、自分でスレッドは作る必要があります。 それがTask.Run等です。 次にasyncですが、これも別にスレッドをどうこうはしません。 ただawaitを使いますという宣言です。 なのでawaitを使わなければ gazette2さんの言う通りただの一般関数です。 そして戻り値のTaskですが、これも別にスレッドをどうこうするものではないです。 これはint型の戻り値とTaskの状態が入っているだけです。 awaitはこのTaskの状態が完了になったら、元のスレッドで続行し、中のintを返すだけです。 Taskが別スレッドで動いたかは関係ないです。完了になったら終わるだけです。 ``` await Task.Delay(100); ``` このTask.Delayの中ではタイマーが呼び出されて、指定時間後にTaskの状態を完了に切り替える 動作をしています。タイマーは別スレッドです。 指定時間たつまでメインスレッドは暇です。なのでUIの更新等別の処理を行えます。 そして、Taskの状態が完了になったら、awaitはメインスレッドで 続きの処理(今回はreturn a;)を続行します。 追記(2018/03/06 12:08): 例えば今回のGetIntValueを別スレッドで実行するには、 ``` private async Task GetintValue() { return await Task.Run(async () => { a++; await Task.Delay(100); return a; }); } ``` このようにすることで別スレッドで実行されます。