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()
関数の間を移動し続けます。
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