【C#】非同期処理の短いサンプル

2023年8月18日

C#では、非同期処理はasyncおよびawaitキーワードを使用して実現されます。簡単な説明を以下に示します。

非同期処理とは?

C#の非同期処理は、アプリケーション内で複数のタスクを同時に実行するための方法です。これにより、長時間かかる操作(例: ファイルの読み書き、ネットワークリクエストなど)が他の操作をブロックすることなく実行されることが可能です。

非同期メソッドの作成

非同期処理を行いたいメソッドには、戻り値型の前にasync修飾子を追加します。これにより、メソッド内で非同期操作を行うことができるようになります。

async Task DoAsyncWork()
{
    // 非同期処理のコード 
}

非同期操作の待機

非同期操作が完了するまで待つためには、awaitキーワードを使用します。awaitは非同期メソッド内でのみ使用できます。

async Task DoAsyncWork() 
{ 
    // 非同期処理の開始 
    await SomeAsyncOperation(); 

    // 非同期処理完了後に実行されるコード 
}

非同期操作の実行

実際の非同期操作は、通常非同期メソッド内で行われます。非同期操作を行うメソッドは、必ず非同期メソッドである必要はありませんが、非同期メソッドとして実装することで、他の非同期処理と組み合わせて簡潔で効果的なコードを書くことができます。

async Task SomeAsyncOperation() 
{
    // 非同期の処理を行う(例: ネットワークリクエスト、ファイル操作など) 
}

以上がC#の非同期処理の基本的な説明です。非同期処理を使用することで、アプリケーションのレスポンス性を向上させ、効率的な並行処理を実現することができます。

サンプルプログラムの流れ

  1. ユーザーはプログラムを開始します。この時点ではMainメソッドが呼び出されます。
  2. Programパートはアクティブになり、コンソールに「非同期処理を開始します。」というメッセージを出力します。
  3. ProgramパートはDoAsyncWorkメソッドを非同期で呼び出します。この時、DoAsyncWorkがアクティブになります。
  4. DoAsyncWorkパートはコンソールに「非同期タスクを開始します。」というメッセージを出力します。
  5. DoAsyncWorkパートはTask.Delayメソッドを非同期で呼び出して、2秒の待機をシミュレートします。この部分はTaskパートで示されます。
  6. Taskパートは2秒の待機が完了したことを示すために、自身を非アクティブにします。
  7. DoAsyncWorkパートはコンソールに「非同期タスクが完了しました。」というメッセージを出力し、その後非アクティブになります。
  8. Programパートは非同期処理の完了を待っているため、再びアクティブになります。そして、コンソールに「非同期処理が完了しました。」というメッセージを出力します。

このシーケンス図は、非同期処理の進行やメソッド間の関係を視覚的に表現しています

サンプルコード

この例では、非同期メソッドを使用して、非同期にタスクを実行し、その結果を待機します

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("非同期処理を開始します。");

        // 非同期メソッドを呼び出し、その完了を待機します
        await DoAsyncWork();

        Console.WriteLine("非同期処理が完了しました。");
    }

    static async Task DoAsyncWork()
    {
        Console.WriteLine("非同期タスクを開始します。");
        
        // 何か非同期の処理をシミュレートします
        await Task.Delay(2000); // 2秒待機
        
        Console.WriteLine("非同期タスクが完了しました。");
    }
}

実行結果

まず、プログラムが開始されると、"非同期処理を開始します。"というメッセージが表示されます。その後、DoAsyncWork メソッド内で非同期タスクが開始され、"非同期タスクを開始します。"というメッセージが表示されます。その後、Task.Delay メソッドによって2秒間待機され、最終的に"非同期タスクが完了しました。"というメッセージが表示されます。最後に、"非同期処理が完了しました。"というメッセージが表示されてプログラムが終了します

非同期処理を開始します。
非同期タスクを開始します。
非同期タスクが完了しました。
非同期処理が完了しました。

おまけ

サンプルコードをトップレベルステートメントで記述すると

using System;
using System.Threading.Tasks;

Console.WriteLine("非同期処理を開始します。");

// 非同期メソッドを呼び出し、その完了を待機します
await DoAsyncWork();

Console.WriteLine("非同期処理が完了しました。");

async Task DoAsyncWork()
{
    Console.WriteLine("非同期タスクを開始します.");
    
    // 何か非同期の処理をシミュレートします
    await Task.Delay(2000); // 2秒待機
    
    Console.WriteLine("非同期タスクが完了しました。");
}

C#,学習,非同期

Posted by hidepon