C#上級

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

導入

非同期処理は、現代のアプリケーション開発において避けては通れない技術です。特に、ユーザーインターフェースが求められるデスクトップアプリやウェブアプリでは、処理がブロックされることなく、スムーズな操作を実現することが求められます。本記事では、C#を用いた非同期処理の具体的なシナリオを通じて、実務で役立つ知識を深めていきます。

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

重要な概念の整理

非同期処理において特に重要な概念は、タスクとawaitキーワードです。タスクは、非同期操作の結果を表し、awaitはその結果が得られるまで処理を一時停止します。この仕組みを正しく理解することで、効率的なプログラムが可能になります。また、非同期処理にはスレッドプールやコンテキストスイッチの理解も不可欠です。

コード例(C#)


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

class Program
{
    static async Task Main(string[] args)
    {
        var result = await FetchDataAsync("https://api.example.com/data");
        Console.WriteLine(result);
    }

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

コードの行ごとの解説

  1. using System; – 必要な名前空間をインポートします。
  2. using System.Net.Http; – HTTP通信を行うための名前空間をインポートします。
  3. using System.Threading.Tasks; – 非同期プログラミングに必要なタスクを扱うための名前空間をインポートします。
  4. static async Task Main(string[] args) – 非同期メインメソッドの定義です。
  5. var result = await FetchDataAsync(“https://api.example.com/data”); – 非同期メソッドを呼び出し、その結果を待機します。
  6. static async Task FetchDataAsync(string url) – URLからデータを非同期に取得するメソッドです。
  7. using (HttpClient client = new HttpClient()) – HTTPクライアントのインスタンスを作成し、スコープが終了すると自動的に解放されます。
  8. var response = await client.GetAsync(url); – 指定されたURLに対して非同期でGETリクエストを送信します。
  9. response.EnsureSuccessStatusCode(); – HTTPレスポンスが成功かどうかを確認します。失敗した場合は例外をスローします。
  10. return await response.Content.ReadAsStringAsync(); – レスポンスの内容を非同期で読み取り、結果を返します。

練習問題編

以下の練習問題に取り組んでみてください。

  1. 問題1: 非同期メソッド内で例外が発生した場合、どのように処理すべきか説明してください。
  2. 模範解答: try-catchブロックを用いて例外を捕捉し、適切なエラーメッセージを表示するか、ログに記録することが推奨されます。
  3. 問題2: タスクを並行して実行する方法を示すコードを作成してください。
  4. 模範解答: Task.WhenAllメソッドを使用して、複数のタスクを同時に実行し、全てのタスクが完了するのを待ちます。
  5. 問題3: 非同期メソッドを使用する際の性能上の注意点は何ですか?
  6. 模範解答: 不要なawaitを使用しないことが重要です。awaitを多用すると、パフォーマンスが低下する可能性があります。

まとめ

  • 非同期処理は、アプリケーションの応答性を向上させるために不可欠です。
  • タスクとawaitを適切に使用することで、効率的な非同期プログラムを構築できます。
  • エラーハンドリングや性能への配慮も重要です。