C# で async と await

Muhammad Maisam Abbas 2024年2月16日
C# で async と await

このチュートリアルでは、C# での非同期プログラミングについて説明します。

C# での非同期プログラミング

同期アプリケーションでいずれかのプロセスがブロックされると、アプリケーション全体がブロックされ、その特定のプロセスが完了するまで応答を停止します。このシナリオでは、非同期プログラミングを使用できます。非同期プログラミングを使用すると、この特定のプロセスが実行されるまで、アプリケーションはいくつかの独立したタスクでバックグラウンドで作業を続けることができます。非同期プログラミングでは、アプリケーション全体が 1つの時間のかかるプロセスに依存するだけではありません。非同期プログラミングは、I/O バウンドまたは CPU バウンドのタスクで使用されます。非同期プログラミングの主な用途は、I/O バウンドまたは CPU バウンドのプロセスが実行を完了するのを待っている間にスタックしない応答性の高いユーザーインターフェイスを作成することです。await および async キーワードは、C# での非同期プログラミングに使用されます。await キーワードは、呼び出し元の関数に制御を戻します。await キーワードは、C# で非同期プログラミングを可能にするメインキーワードです。async キーワードawait キーワードを有効にします。await キーワードを使用する関数は、async キーワードを持ち、C# で Task オブジェクトを返す必要があります。await キーワードは、C# で async キーワードなしでは使用できません。次のコード例は、C# での同期プログラミングを示しています。

using System;
using System.Threading.Tasks;

namespace async_and_await {
  class Program {
    public static void process1() {
      for (int i = 0; i < 5; i++) {
        Console.WriteLine("Process 1");
        Task.Delay(100).Wait();
      }
    }
    public static void process2() {
      for (int i = 0; i < 5; i++) {
        Console.WriteLine("Process 2");
        Task.Delay(100).Wait();
      }
    }
    static void Main(string[] args) {
      process1();
      process2();
    }
  }
}

出力:

Process 1
Process 1
Process 1
Process 1
Process 1
Process 2
Process 2
Process 2
Process 2
Process 2

上記のコードでは、関数 process1()process2() は独立したプロセスですが、process2() 関数は process1() 関数の完了を待つ必要があります。この単純な同期プログラミングコードは、C# で async および await キーワードを使用して非同期プログラミングに変換できます。

using System;
using System.Threading.Tasks;

namespace async_and_await {
  class Program {
    public static async Task process1() {
      await Task.Run(() => {
        for (int i = 0; i < 5; i++) {
          Console.WriteLine("Process 1");
          Task.Delay(100).Wait();
        }
      });
    }
    public static void process2() {
      for (int i = 0; i < 5; i++) {
        Console.WriteLine("Process 2");
        Task.Delay(100).Wait();
      }
    }
    static void Main(string[] args) {
      process1();
      process2();
    }
  }
}

出力:

Process 2
Process 1
Process 1
Process 2
Process 2
Process 1
Process 1
Process 2
Process 2
Process 1

上記のコードでは、async および await キーワードを使用して、前の例を非同期プログラミングに変換しました。出力は、process2() 関数が process1() 関数の完了を待機しないことを明確に示しています。process1() 関数の定義では、async キーワードを使用して、これが非同期的に実行される関数であることを示しました。process1() 関数の await キーワードは、制御をメイン関数に戻し、メイン関数は process2() 関数を呼び出します。コントロールは、process1() 関数が完了するまで、process1() 関数と process2() 関数の間を移動し続けます。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn