カテゴリ: C# 更新日: 2026/08/27

C#の非同期処理を完全攻略!asyncとawaitでAPI通信を効率化する方法

C#で非同期API通信を実装する方法(async/await)
C#で非同期API通信を実装する方法(async/await)

先生と生徒の会話形式で理解しよう

生徒

「C#でWeb上のデータを取得するAPI通信をすると、画面が固まって動かなくなることがあります。なぜでしょうか?」

先生

「それは、通信が終わるまでプログラム全体が待ちぼうけをしているからです。これを防ぐのが非同期処理ですよ。」

生徒

「非同期処理?何だか難しそうですが、初心者でも実装できますか?」

先生

「asyncとawaitという魔法の言葉を使えば簡単です。一緒に仕組みから学んでいきましょう!」

1. 非同期処理とは何か?直感的に理解する

1. 非同期処理とは何か?直感的に理解する
1. 非同期処理とは何か?直感的に理解する

プログラミングにおいて非同期処理とは、一つの作業が終わるのを待たずに、次の別の作業を進める仕組みのことです。例えば、キッチンで料理を作るときに、お湯を沸かしている間に野菜を切りますよね。これが非同期の考え方です。もし同期処理なら、お湯が沸くまでの数分間、完全に立ち尽くして何もできない状態になってしまいます。プログラムの世界でも、Webサイトからデータを受け取る「API通信」には時間がかかります。非同期処理を使うことで、通信中も他の処理を並行して動かし、パソコンがフリーズしたような感覚を防ぐことができるのです。

2. API通信の基礎知識とHttpClient

2. API通信の基礎知識とHttpClient
2. API通信の基礎知識とHttpClient

APIとは、外部のサービスやWebサーバーとプログラム同士が情報をやり取りするための窓口です。C#でこの窓口と通信するために最もよく使われるのがHttpClientというクラスです。クラスとは、関連する機能やデータを一つにまとめた設計図のようなものです。HttpClientを使うことで、Webサイト上のデータ取得や送信を簡単に行うことができます。しかし、Web通信は相手先のサーバーの状態によって時間がかかるため、通常の書き方ではプログラムが停止してしまいます。ここで役立つのが、次に紹介するasyncawaitです。

3. asyncとawaitの基本的な役割

3. asyncとawaitの基本的な役割
3. asyncとawaitの基本的な役割

C#では、async(エイシンク)await(アウェイト)というキーワードを使うことで、非同期処理を直感的に記述できます。asyncは「このメソッドは非同期で動きますよ」と宣言するために、メソッド名の前につけます。awaitは「ここから先は処理が終わるまで待ちますが、他の処理もできるようにしておきますね」という指示を出すために使います。これを使うことで、複雑な待ち合わせの仕組みを自動的に作成してくれるのです。


public async Task GetDataAsync()
{
    using HttpClient client = new HttpClient();
    string result = await client.GetStringAsync("https://example.com/api");
    Console.WriteLine(result);
}

4. 非同期メソッドの戻り値Taskについて

4. 非同期メソッドの戻り値Taskについて
4. 非同期メソッドの戻り値Taskについて

非同期メソッドでは、通常の戻り値の代わりにTask(タスク)を使用します。Taskとは、将来的に完了する予定の仕事を表すオブジェクトです。プログラムは「今すぐ結果は出せないけれど、とりあえずこの約束のタスクを渡すね」という形で処理を進めます。もし戻り値がない場合はTaskを使い、文字列や数字を返したい場合はTask<string>のように記述します。この仕組みがあるおかげで、呼び出し側のコードも「いつ終わるかわからない処理」を正しく管理できるようになります。

5. 例外処理でエラーに備える

5. 例外処理でエラーに備える
5. 例外処理でエラーに備える

Web通信は必ず成功するとは限りません。相手のサーバーがダウンしていたり、インターネットが切断されていたりする場合もあります。このような予期せぬ事態が起きたときにプログラムが強制終了しないように、try-catch(トライ・キャッチ)という仕組みで囲んでエラーを処理します。tryブロックの中では通常の処理を行い、エラーが発生した瞬間にcatchブロックに移動して、エラーの内容を確認します。これにより、ユーザーに分かりやすいメッセージを表示することが可能になります。


public async Task SafeGetDataAsync()
{
    try
    {
        using HttpClient client = new HttpClient();
        string data = await client.GetStringAsync("https://invalid-url.com");
    }
    catch (HttpRequestException e)
    {
        Console.WriteLine("通信エラーが発生しました: " + e.Message);
    }
}

6. 複数同時通信の最適化

6. 複数同時通信の最適化
6. 複数同時通信の最適化

非同期処理の大きな利点は、複数の作業を同時に進行できることです。例えば、一度に3つの異なるAPIからデータを取得したい場合、順番に待っていると非常に時間がかかります。しかし、それぞれの通信をTaskとして開始し、最後にすべてが完了するのを待つように記述することで、全体の待ち時間を大幅に短縮できます。これはTask.WhenAllという便利なメソッドを使うことで簡単に実装できます。これにより、高速でレスポンスの良いアプリケーションを作ることが可能です。


public async Task DownloadAllAsync()
{
    using HttpClient client = new HttpClient();
    Task<string> task1 = client.GetStringAsync("https://api.site1.com");
    Task<string> task2 = client.GetStringAsync("https://api.site2.com");
    
    string[] results = await Task.WhenAll(task1, task2);
    Console.WriteLine("全ての取得が完了しました。");
}

7. 実際のコードを動かしてみよう

7. 実際のコードを動かしてみよう
7. 実際のコードを動かしてみよう

最後に、これまでの知識をまとめた実践的なプログラムを見てみましょう。ここでは、APIからデータを取得し、それを画面に表示するまでの一連の流れを作成します。まずHttpClientを作成し、awaitを使ってサーバーからの応答を待ちます。このとき、プログラムは停止せず、裏側で通信が完了するのを待っている状態です。通信が完了したら、awaitの行の直下から処理が再開されます。


using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using HttpClient client = new HttpClient();
        Console.WriteLine("通信を開始します...");
        string response = await client.GetStringAsync("https://jsonplaceholder.typicode.com/posts/1");
        Console.WriteLine("取得したデータ: " + response);
    }
}

実行結果は以下のようになります。


通信を開始します...
取得したデータ: { "userId": 1, "id": 1, "title": "...", "body": "..." }
カテゴリの一覧へ
新着記事
New1
C#
C#とは何か?初心者向けにできること・特徴・インストール手順までやさしく解説
New2
C#
C#のメソッドを引数に渡す方法!高階関数の基本を学ぼう
New3
Azure
Azure Front Door Analytics活用|リアルタイム監視とレポートで通信を分析
New4
COBOL
COBOLで数値比較とALPHABETIC・NUMERIC条件をやさしく解説!初心者でも安心ガイド
人気記事
No.1
Java&Spring記事人気No1
C#
C#のWPFとは?XAMLでGUI開発を基礎から完全解説!初心者向けの入門ガイド
No.2
Java&Spring記事人気No2
COBOL
COBOL教育における教材とリソース完全ガイド!初心者でもわかるプログラミング学習の選び方
No.3
Java&Spring記事人気No3
Azure
Azure SQL Database購入モデル比較!vCoreとDTUの違いと選び方を初心者向けに解説
No.4
Java&Spring記事人気No4
C#
C#のLINQでWhere句を使いこなす!初心者でもわかるデータ抽出とフィルタリング
No.5
Java&Spring記事人気No5
COBOL
COBOLのCOPY句の使い方を完全ガイド!初心者でもわかる共通部品の再利用方法
No.6
Java&Spring記事人気No6
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.7
Java&Spring記事人気No7
C#
C#のLINQでFirstとFirstOrDefaultの違いと使い方を完全解説!初心者向けガイド
No.8
Java&Spring記事人気No8
C#
C#のforeachループを完全ガイド!初心者でもわかるコレクション操作の基本