回答編集履歴

1 Task.Runサンプル追加

sh_akira

sh_akira score 380

2018/03/06 12:09  投稿

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る