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

C#のasync/awaitキーワードで実現する非同期プログラミング入門

C#における非同期プログラミングの概要

非同期プログラミングは、処理がブロックされたり応答が遅延したりする状況を効率的に扱うための手法です。同期処理では、あるタスクがブロックされるとアプリケーション全体がその完了を待つことになり、処理時間が長くなります。最悪の場合、アプリケーションが「応答なし」の状態に陥ってしまいます。

一方、非同期アプローチを採用すれば、時間のかかる処理の完了を待つ間も、アプリケーションは他のタスクを継続して実行できます。

asyncキーワードとawaitキーワード

C#では、非同期プログラミングを実現するために asyncawait の2つのキーワードが用意されています。これらを活用することで、.NET Framework や .NET Core などの各種リソースを効率的に扱えます。

async キーワードを付けて定義されたメソッドは「非同期メソッド(asyncメソッド)」と呼ばれます。

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

GUIアプリケーションを例に考えてみましょう。GUIアプリケーションはメッセージキューの内容を確認し、未処理のタスクがあればそれを取り出して処理します。このコードが同期的に実行される場合、未処理のタスクが先に完了するまで他の操作は一切受け付けられません。処理に予想以上の時間がかかると、アプリケーションはメッセージへの応答を停止してしまい、ユーザーにはフリーズしたように見えます。

問題のあるコード例(同期処理)

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

このコードでは、GetResponse() が完了するまでUIスレッドがブロックされます。その間、ウィンドウの操作や再描画ができなくなり、ユーザーエクスペリエンスが大きく損なわれます。

async / awaitによる解決策

上記の問題を解決するには、asyncawait キーワードを使用します。

改善後のコード例(非同期処理)

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

ポイントは次の2つです。

  • メソッド宣言に async を付けて非同期メソッドとして定義する
  • 同期的な GetResponse() を非同期版の GetResponseAsync() に置き換え、呼び出しに await を付ける

こうすることで、ネットワーク応答を待っている間もUIスレッドはブロックされず、アプリケーションはユーザーの操作に継続的に応答できます。

まとめ

ネットワーク通信やファイルI/Oなど、完了まで時間がかかる可能性のある処理を含む場合は、async/await を活用した非同期プログラミングを採用することで、アプリケーションの応答性を維持しながら効率的に処理を実行できます。特にGUIアプリケーションでは、UIフリーズを防ぐための重要なテクニックといえるでしょう。

  1. MacでPython 3にアップグレードして使いこなす方法

    購入したばかりの新しいMacには、必要なソフトウェアの最新版がすべて入っていると思いがちですが、ユーザー向けアプリについては概ね正しくても、基盤となるフレームワークに関しては話が別です。安定版の最新リリースがPython 3.5であるにもかかわらず、新しいMacには今なおPython 2.7.10がプリインストールされています。バージョン間の差が大きく感じられるのはそのためです。ただし、新しいバージョンが必ずしも優れているとは限りません。Python 3はPython 2との後方互換性を持たず、多くの開発者は依然としてPython 2を使い続けているのです。 2to3を使うか、使わないか?

  2. WordPressでJavaScriptの解析を遅延させる方法|DeferとAsyncの使い方を徹底解説

    表示速度の速いWordPressサイトは、訪問者のユーザー体験の向上、検索エンジンでの視認性の改善、オーガニック流入の増加といった面で大きなメリットをもたらします。 WebページはHTML、CSS、JavaScript、画像で構成されており、ページの読み込み時間を短縮するには、それぞれを最適化する必要があります。特に画像はページサイズに与える影響が大きいため、WordPressの画像最適化プラグインを使ってファイルサイズを削減することが重要です。 コードの種類主な用途HTMLページのコンテンツや構造の定義CSSフォント、色、余白などのスタイリングJavaScriptボタン、フォーム、動画、