非同期プログラミングを始めよう
開発者は、非同期プログラミング手法を使用して、パフォーマンスのボトルネックを回避し、アプリケーションの全体的な応答性を高めます。 ただし、非同期アプリケーションを記述するための従来の手法は複雑になり、書き込み、デバッグ、保守が困難になる場合があります。
C# では、.NET ランタイムでの非同期サポートを活用する簡略化された非同期プログラミング アプローチがサポートされています。 コンパイラは開発者が行った困難な作業を行い、アプリケーションは同期コードに似た論理構造を保持します。 その結果、非同期プログラミングのすべての利点が少しの労力で得られます。
実際の環境での非同期プロセスのしくみを理解することは、アプリケーションで非同期プログラミングを使用する方法を理解するのに役立ちます。
現実世界の非同期プロセスを調べる
朝食の作成は、タスクを非同期的に実行する利点があるプロセスの良い例です。 朝食は、同期的または非同期的に実行できる一連のタスクと考えることができます。
- パントリーから朝食の食材を入手してください。
- コーヒーを一杯注ぎます。
- フライパンを熱し、次に3スライスのソーセージを揚げます。
- 2個の卵を揚げます。
- 2 枚のパンをトーストします。
- トーストにバターとジャムを広げます。
- オレンジジュースを1杯注ぎます。
調理の経験がある場合は、これらの手順を非同期的に完了できます。 ベーコンと卵のためにフライパンを温め、その後、パントリーから材料を取り出します。 あなたはトースターにパンを入れて、その後、ソーセージを調理し始めます。 プロセスの各ステップで、まずタスクを開始し、その後、注意を払う準備が整った他のタスクに移行します。
朝食の調理は、並列ではない非同期作業の良い例です。 1 人のユーザー (またはスレッド) がすべてのタスクを処理できます。 前のタスクが完了する前に次のタスクを開始することで、1 人のユーザーが朝食を非同期的に行うことができます。 誰かがプロセスを積極的に見ているかどうかに関係なく、各調理タスクが進行します。 鍋を温め始めるとすぐに、パントリーから食材を手に入れることができます。 ベーコンが焼け始めたら、トースターにパンを入れることができます。
並列アルゴリズムの場合は、調理する複数のユーザー (または複数のスレッド) が必要です。 一人の人が卵を調理し、別の人がソーセージをフライします。 各ユーザーは、1 つの特定のタスクに焦点を当てます。 調理中のそれぞれの人 (または各スレッド) がブロックされ、現在のタスクが完了するまで同期的に待機します。ベーコンは裏返す準備ができ、トースターのパンは今にも飛び出しそう、などです。
非同期プログラミング手法を使用すると、一度に複数のタスクを実行して朝食をより効率的に行う方法と同様に、アプリケーションの効率と応答性を向上させることができます。
非同期により応答性が向上する
非同期性は、Web アクセスなど、ブロックされる可能性があるアクティビティに不可欠です。 Web リソースへのアクセスが遅くなったり、遅れたりすることがあります。 このようなアクティビティが同期プロセスでブロックされた場合、アプリケーション全体が待機する必要があります。 非同期プロセスでは、ブロックする可能性のあるタスクが完了するまで、Web リソースに依存しない他の作業をアプリケーションで続行できます。
次の表は、非同期プログラミングによって応答性が向上する一般的な領域を示しています。 .NET と Windows ランタイムの一覧に示されている API には、非同期プログラミングをサポートするメソッドが含まれています。
| アプリケーション エリア | 非同期メソッドを使用した .NET 型 | 非同期メソッドを使用した Windows ランタイム型 |
|---|---|---|
| Web アクセス | HttpClient | Windows.Web.Http.HttpClient、SyndicationClient |
| ファイルの操作 | JsonSerializer、StreamReader、StreamWriter など | ストレージファイル |
| 画像の操作 | MediaCapture、BitmapEncoder、BitmapDecoder | |
| WCF プログラミング | 同期操作と非同期操作 |
非同期メソッドを作成して呼び出す方法
C# では、 async キーワードと await キーワードを使用して実装される非同期操作。 async キーワードは非同期メソッドの定義に使用されますが、await キーワードは非同期メソッドを呼び出し、呼び出し元のスレッドをブロックせずに結果を待機するために使用されます。 非同期操作は通常、待機可能な進行中の操作を表す Task 型または Task<T> 型を使用して実装されます。
C# で非同期タスクを作成して呼び出す方法の例を次に示します。
using System;
using System.IO;
using System.Threading.Tasks;
public class Program
{
public static async Task Main()
{
string filePath = "example.txt";
string content = await ReadFileAsync(filePath);
Console.WriteLine(content);
}
public static async Task<string> ReadFileAsync(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
string content = await reader.ReadToEndAsync();
return content;
}
}
}
この例では、 ReadFileAsync メソッドは async キーワードを使用して定義され、戻り値の型は Task<string> です。 async キーワードは、メソッドに非同期操作が含まれていることを示し、Task<string>の戻り値の型は、メソッドが非同期操作を表すタスクを返したことを示します。 Task<string>型は、文字列値を返す非同期操作を表す汎用タスクです。 ReadFileAsync メソッドは、ファイル パスをパラメーターとして受け取り、ファイルの内容を非同期的に読み取ります。
Main メソッドも非同期として定義され、ReadFileAsync キーワードを使用してawait メソッドを呼び出せるようにします。 await キーワードは、プログラムが非同期操作の結果を待機してから続行する必要があることを示すために使用されます。 この場合、プログラムはファイルが読み取られるのを待ってから、その内容をコンソールに出力します。
概要
このユニットでは、非同期プログラミングの利点と、アプリケーションの応答性を向上させる方法について学習しました。 また、C# で async キーワードと await キーワードを使用して非同期メソッドを作成して呼び出す方法についても学習しました。 これらの手法を使用すると、ユーザー インターフェイスをフリーズさせたり、他のタスクをブロックしたりすることなく、ブロックする可能性のある操作を処理できる、より効率的で応答性の高いアプリケーションを作成できます。
重要なポイント
- 非同期プログラミングにより、アプリケーションのパフォーマンスと応答性が向上します。
- C# では、非同期プログラミングに対する簡略化されたアプローチが提供されます。
- 非同期プログラミングは、Web アクセスなどのアクティビティをブロックする可能性がある場合に役立ちます。
- C# では、非同期メソッドは
asyncキーワードを使用して作成され、awaitキーワードを使用して呼び出されます。 TaskまたはTask<T>型は、C# で待機できる継続的な操作を表します。