C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のasync・awaitキーワードとは?非同期プログラミングの基本を解説

C#におけるasync・awaitキーワード

C#では、asyncawaitという2つのキーワードを使用することで、シンプルかつ効率的に非同期プログラミングを実現できます。これらのキーワードを活用すると、ネットワーク通信やファイル入出力など時間のかかる処理を実行中でも、アプリケーションのUIをブロックせず、高い応答性を維持できます。

同期処理が引き起こす問題点

GUIアプリケーションは、メッセージキューの内容を常にチェックし、未処理のタスクがあれば取り出して順番に処理していきます。しかし、コードが同期的に実行されると、現在のタスクが完了するまで次の処理に進めません。その結果、処理に予想以上の時間がかかった場合、アプリケーションはメッセージへの応答を停止し、「応答なし」状態としてフリーズしたように見えてしまいます。

以下のコードを見てみましょう。

private void OnRequestDownload(object sender, RoutedEventArgs e) {
    var req = HttpWebRequest.Create(_requestedUri);
    var res = req.GetResponse();
}

このコードでは、GetResponse()が完了するまでUIスレッドが完全にブロックされます。そのため、ダウンロード中はウィンドウの移動やボタンのクリックなど、ユーザー操作に一切反応できなくなります。

async・awaitによる解決策

この問題を解決するには、メソッドにasync修飾子を付け、時間のかかる非同期操作に対してawaitキーワードを使用します。

private async void OnRequestDownload(object sender, RoutedEventArgs e) {
    var req = HttpWebRequest.Create(_requestedUri);
    var res = await req.GetResponseAsync();
}

ここでは、同期版のGetResponse()の代わりに、非同期版であるGetResponseAsync()を呼び出し、その結果をawaitで待機しています。これにより、ダウンロードの完了を待つ間もUIスレッドはメッセージ処理を続けられ、アプリケーションはユーザーの操作にスムーズに応答し続けます。

押さえておきたいポイント

  • async:メソッド内でawaitを使用できるようにするための修飾子です。
  • await:非同期処理の完了を待機し、その間に制御を呼び出し元へ返すことでUIのブロックを防ぎます。
  • 非同期メソッドは、慣例として「Async」で終わる名前を付けるのが一般的です(例:GetResponseAsync)。
  1. JavaScriptのasync/await関数とは?Promiseを活用した非同期処理の基本

    Promiseオブジェクトは、非同期処理の最終的な完了(または失敗)と、その結果得られる値を表すものです。async/await関数は、このPromiseを基盤として動作します。async/awaitを使うことで、内部では非同期タスクを実行しながら、コードの見た目は完全に同期的に記述できます。これにより、ネストが深くなりがちなコールバックスタイルを避け、可読性の高いコードを書くことが可能になります。Promiseを返す非同期関数の例たとえば、2秒後に値100で解決されるPromiseを返す非同期関数を考えてみましょう。 { resolve(100); }

  2. HTMLのvarタグとは?数式の変数を表示する使い方とサンプルコード

    HTMLの<var>要素は、数式や計算式の中で使われる変数(variable)を表すために使用されます。<var>タグで囲まれたテキストは、多くのブラウザでイタリック体(斜体)として表示されるのが特徴です。 それでは、実際に<var>タグをHTMLで実装する例を見ていきましょう。 サンプルコード <!DOCTYPE html> <html> <body> <h2>Mathematical Equation</h2> <p>Sample equation: <var>2x&l