本文へスキップ
BecomeCoder

C#実践コース · 第1章 非同期プログラミング · レッスン2

戻り値のある非同期(Task<T>)

ブラウザで完結

導入

非同期処理も「結果」を返せます。「サーバーから取得した数値」のように、待った後に値を受け取るにはTask<T>を使い、awaitでその中身を取り出します。

図解

flowchart LR
    A["FetchPriceAsync()"] --> T["Task&lt;int&gt;<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です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。