0Pricing
C# Academy · レッスン

Task/ValueTaskとasyncステートマシン(概念)

Taskの結果とasyncステートマシンの考え方を理解します。小さな非同期メソッドを記述し、awaitを組み合わせ、手動のTaskCompletionSourceを確認します。

「Task/ValueTaskとasyncステートマシン(概念)」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。

非同期処理のメンタルモデル

目的: 非同期処理の直感的な理解を身につけます。

  • Task は進行中の処理と将来の結果を表します
  • await は一時停止し、後で再開します
  • コンパイラーが状態機械を作成します
  • ValueTask: より新しい最適化です(ここでは概念のみ扱います)

非同期メソッドの基礎

async メソッドは Task<T> をすぐに返し、await した処理が完了すると、後で値を伴って完了します。

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  // Tiny async method: returns Task<int>
  static async Task<int> GetAnswerAsync()
  {
    // Offload simple work to a thread-pool task (demo only)
    int value = await Task.Run(() =>
    {
      Thread.Sleep(200); // simulate work
      return 42;
    });
    return value; // completes Task<int>
  }

  public static void Main(string[] args)
  {
    // In C# 6, Main cannot be async; block just for demo (console apps are safe here)
    int result = GetAnswerAsync().Result;
    Console.WriteLine("Answer = " + result);
  }
}

await の組み合わせ

await を使うと、非同期処理の順序立てた手順を、明確な上から下への形式で記述できます。

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  static async Task<int> Step1Async()
  {
    // pretend I/O
    await Task.Delay(100);
    return 10;
  }

  static async Task<int> Step2Async(int x)
  {
    await Task.Delay(100);
    return x * 3; // simple transform
  }

  static async Task<int> PipelineAsync()
  {
    int a = await Step1Async();   // await first
    int b = await Step2Async(a);  // then await second
    return a + b;                 // total 10 + 30 = 40
  }

  public static void Main(string[] args)
  {
    int total = PipelineAsync().Result; // block in demo
    Console.WriteLine("Total = " + total);
  }
}

状態機械の考え方

概念: コンパイラーは async メソッドを状態機械に変換します。

  • ローカル変数はフィールドとして保存されます
  • 各 await で新しい状態に移行します
  • await した Task が完了すると、継続処理によってメソッドが再開されます
  • 例外は捕捉され、Task に設定されます

TaskCompletionSource のデモ

TaskCompletionSource を使うと、Task を作成して後から完了を通知できます。await で他の Task と同様に待機できます。

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
  // Emulate an async source that completes later
  static Task<string> MakeTaskManually()
  {
    var tcs = new TaskCompletionSource<string>();
    // Complete on a worker after a short delay
    ThreadPool.QueueUserWorkItem(_ =>
    {
      Thread.Sleep(150);
      tcs.SetResult("done");
    });
    return tcs.Task;
  }

  static async Task<string> UseAsyncSource()
  {
    string s = await MakeTaskManually(); // await a Task you created
    return s.ToUpperInvariant();
  }

  public static void Main(string[] args)
  {
    Console.WriteLine(UseAsyncSource().Result);
  }
}

ValueTask の概念

ValueTask(概念): 同期的に完了することが多い結果向けの、より新しく割り当てを節約できる戻り値の型です。

  • ほとんどの場合に結果がすでに利用可能なときに役立ちます
  • 追加の割り当てを避けるためのルールがあります
  • C# 6 では利用できないため、ここでは Task を使用します。考え方は適用できます

非同期状態機械

確認問題: await を使用する async メソッドに対して、C# コンパイラーは何を生成しますか。

まとめ

まとめ: Task は処理を表し、await は一時停止と再開を行い、コンパイラーは状態機械を構築します。ValueTask は最適化の概念です(C# 6 では Task を使用します)。

よくある質問

「Task/ValueTaskとasyncステートマシン(概念)」レッスンは無料ですか?

はい。「Task/ValueTaskとasyncステートマシン(概念)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。

「Task/ValueTaskとasyncステートマシン(概念)」で何を学びますか?

Taskの結果とasyncステートマシンの考え方を理解します。小さな非同期メソッドを記述し、awaitを組み合わせ、手動のTaskCompletionSourceを確認します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。

「Task/ValueTaskとasyncステートマシン(概念)」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Task/ValueTaskとasyncステートマシン(概念)
  2. 非同期処理の注意点:sync-over-asyncとデッドロック
  3. ConfigureAwaitと例外の伝播
← C# Academyに戻る