Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
async / await
非同期メソッドを定義・呼び出すためのキーワードです。『async』でメソッドを非同期化し、『await』で非同期操作の完了を待機します。
構文
// 非同期メソッドの定義(戻り値なし)
async Task MethodName()
{
await 非同期処理;
}
// 非同期メソッドの定義(戻り値あり)
async Task<T> MethodName()
{
T result = await 非同期処理;
return result;
}
// 非同期メソッドの呼び出し
await MethodName();
T value = await MethodName();
メソッド一覧
| キーワード・型 | 概要 |
|---|---|
| async | メソッドを非同期メソッドとして宣言します。メソッド内で『await』が使えるようになります。 |
| await | 非同期操作の完了を待機します。完了するまでスレッドをブロックせず制御を呼び出し元に返します。 |
| Task | 戻り値なしの非同期操作を表す型です。 |
| Task<T> | 戻り値 T を持つ非同期操作を表す型です。 |
| ValueTask<T> | 同期完了が多い場合に使うヒープ割り当てを抑えた軽量な非同期型です。 |
| async void | イベントハンドラー専用の非同期メソッドです。例外を呼び出し元に伝播できないため通常は避けます。 |
サンプルコード
using System;
using System.Net.Http;
using System.Threading.Tasks;
// 戻り値なしの非同期メソッドを定義します。
async Task PrintGreetingAsync(string name)
{
await Task.Delay(100); // 100ms の遅延をシミュレートします。
Console.WriteLine($"Hello, {name}!");
}
// 戻り値ありの非同期メソッドを定義します。
async Task<int> AddAsync(int a, int b)
{
await Task.Delay(50); // 非同期処理をシミュレートします。
return a + b;
}
// 複数の非同期処理を順番に実行します。
async Task RunSequentialAsync()
{
await PrintGreetingAsync("田中");
await PrintGreetingAsync("鈴木");
int result = await AddAsync(3, 4);
Console.WriteLine($"3 + 4 = {result}");
}
// エントリーポイント(.NET 5 以降は Main を async にできます)
await RunSequentialAsync();
Console.WriteLine("完了");
概要
『async/await』を使うと、スレッドをブロックせずに時間のかかる処理(ネットワーク・ファイル I/O など)の完了を待てます。『await』の時点でスレッドが解放され、完了後に残りのコードが再開されます。
『async void』はイベントハンドラー以外では使わないでください。例外が呼び出し元に伝播されず、デバッグが非常に困難になります。通常は『async Task』を返すようにしてください。
複数の非同期処理を並列で実行したい場合は『Task.Run() / Task.Delay() / Task.WhenAll()』を参照してください。非同期メソッド内の例外処理は『例外処理と非同期』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。