C#中級

中級 C#で学ぶ非同期処理|練習問題編

導入

非同期処理は、現代のアプリケーション開発において不可欠な技術です。特に、ユーザーインターフェースを持つアプリケーションでは、非同期処理を適切に活用することで、スムーズな操作感を実現できます。ここでは、C#を用いた非同期処理の具体的なシチュエーションを考え、実務に役立つ知識を深めていきます。

教科書レベルの解説(非同期処理)

重要な概念の整理

非同期処理は、主にタスクをバックグラウンドで実行し、メインスレッドをブロックしないようにする技術です。これにより、ユーザーはアプリケーションの他の部分を操作し続けることができます。C#では、async/awaitキーワードを使用して、非同期メソッドを簡潔に記述できます。非同期処理を行う際の落とし穴の一つは、例外処理です。非同期メソッド内で発生した例外は、通常の方法ではキャッチできないため、適切な対策が必要です。

コード例(C#)


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

class Program
{
    static async Task Main(string[] args)
    {
        try
        {
            string result = await FetchDataAsync("https://api.example.com/data");
            Console.WriteLine(result);
        }
        catch (HttpRequestException e)
        {
            Console.WriteLine($"Request error: {e.Message}");
        }
    }

    static async Task FetchDataAsync(string url)
    {
        using (HttpClient client = new HttpClient())
        {
            HttpResponseMessage response = await client.GetAsync(url);
            response.EnsureSuccessStatusCode();
            return await response.Content.ReadAsStringAsync();
        }
    }
}

コードの行ごとの解説

  1. using System; – 必要な名前空間をインポートします。
  2. using System.Net.Http; – HTTP通信を行うためのHttpClientクラスを使用します。
  3. using System.Threading.Tasks; – 非同期処理のためのTaskクラスを使用します。
  4. static async Task Main(string[] args) – 非同期メインメソッドを定義します。
  5. try { … } – FetchDataAsyncメソッドを呼び出し、結果を取得します。
  6. catch (HttpRequestException e) – HTTPリクエストでの例外を捕捉し、エラーメッセージを表示します。
  7. static async Task FetchDataAsync(string url) – 非同期メソッドを定義し、指定されたURLからデータを取得します。
  8. using (HttpClient client = new HttpClient()) – HttpClientのインスタンスを生成し、使用後に自動的に解放します。
  9. HttpResponseMessage response = await client.GetAsync(url); – 非同期で指定されたURLにGETリクエストを送信します。
  10. response.EnsureSuccessStatusCode(); – レスポンスが成功でない場合は例外をスローします。
  11. return await response.Content.ReadAsStringAsync(); – レスポンスの内容を非同期で文字列として読み込み、返します。

練習問題編

以下の練習問題に取り組み、非同期処理の理解を深めてください。

  1. 問題1: FetchDataAsyncメソッドを改良し、タイムアウトを設定するコードを追加してください。
  2. 問題2: 複数のURLからデータを同時に取得する非同期メソッドを実装してください。
  3. 問題3: 例外処理を強化し、HTTPステータスコードによって異なるエラーメッセージを表示するようにしてください。
  4. 問題4: 非同期メソッドの実行時間を計測し、結果をコンソールに表示するコードを追加してください。
  5. 問題5: FetchDataAsyncメソッドの結果をJSONとして解析し、特定のフィールドをコンソールに表示する実装を行ってください。

まとめ

  • 非同期処理は、アプリケーションの応答性を向上させるための重要な技術です。
  • 例外処理やタイムアウト設定は、非同期処理を実装する際に注意が必要です。
  • 複数の非同期タスクを同時に管理することで、効率的なデータ取得が可能になります。