導入
非同期処理も「結果」を返せます。「サーバーから取得した数値」のように、待った後に値を受け取るにはTask<T>を使い、awaitでその中身を取り出します。
図解
flowchart LR
A["FetchPriceAsync()"] --> T["Task<int><br/>(いつか int が入る)"]
T -->|await| V["int の値を取り出す"]
サンプル
// await すると Task<int> から int が取り出せる
int price = await FetchPriceAsync();
Console.WriteLine($"価格: {price}円"); // 価格: 500円
// 戻り値がある非同期は Task<戻り値の型> を返す
async Task<int> FetchPriceAsync()
{
await Task.Delay(50); // 通信を待つイメージ
return 500; // 待った後に値を返す
}
- 値を返す非同期メソッドは
Task<T>を返す(Tが結果の型) await 非同期メソッド()で、待ってから中身の値を受け取れるawaitしないとTask<int>のまま(中身のintは取り出せない)
演習
int result = await CalcAsync(10);
Console.WriteLine(result); // 20
// TODO: 引数を2倍して返す非同期メソッド CalcAsync(Task<int>)を定義してください
// (中で Task.Delay(10) を await してから返す)
___
- 期待される出力:
20
ヒント1を見る
async Task<int> CalcAsync(int n) { await Task.Delay(10); return n * 2; }
ヒント2を見る
呼び出し側はawait CalcAsync(10)で結果を受け取ります
まとめ
- 値を返す非同期は
Task<T>を返す awaitで待ってから中身の値を取り出すawaitし忘れると値が取り出せない
次回: 複数の非同期をまとめて待つWhenAllです。