連載:C# 5.0&VB 11.0新機能「async/await非同期メソッド」入門

第1回 .NET開発における非同期処理の基礎と歴史

鈴木 孝明
2012/08/31
Page1 Page2

 「大事なことは分かっているが、とにもかくにも面倒くさい。」

 「非同期処理」というと、そんなイメージがある。開発中の業務アプリなどで非同期処理を実装しなければならなくなったら、大半の方は、何か重たいものを肩に乗せられた気分になり、「待ってました!」などと意気揚々と作業に入ることはないのではないかと思う。もちろん筆者もその1人だ。

 それは、通常書いている同期処理と比べてコーディング量が非常に多くなる(多くなった経験がある)ことが最大の理由だろう。「もっと楽に書きたい」というのが開発者の総意であることは間違いない。

 そして今回、Visual Studio 2012と同時にリリースされた.NET Framework 4.5と、それに対応したC# 5.0やVB(Visual Basic) 11.0で、この煩雑さを大きく改善してくれる新機能「非同期メソッド(async/await)」が搭載された。本連際ではこれから数回にわたって、この非同期メソッドについて解説する。

非同期処理の必要性

 非同期処理がなぜ重要か。その必要性についてはもはや言わずもがなかもしれないが、簡単に押さえておこう。

 非同期処理の採用を検討する必要があるシーンには、例えば次のようなものが挙げられる。

  • 重たい処理をするとき
  • ファイルの読み書きやネットワーク通信など、不定な待ち時間が発生する処理をするとき

 つまり、時間が長くかかる(可能性のある)処理をする際に採用することが推奨される。時間がかかる処理が原因で、アプリケーションやUI(ユーザー・インターフェイス)がフリーズするのを防ぐのが、その主たる目的だ。

 従来のデスクトップ・アプリケーションなら、コマンドの実行に時間がかかってマウス操作に反応しなくなっても多少は待つことができた。しかし、それがスマートフォンやタブレットなどのタッチ・デバイスとなると、どうだろうか。

 皆さんにも経験があるかもしれないが、タッチ操作に対する応答がないと、自分でもびっくりするほど我慢が利かなくなるだろう。タッチ・デバイスが爆発的な普及を見せている昨今、多くのユーザーが同じように感じることは目に見えている。止まらないアプリケーションを作ることは、もはや避けては通れない重要な課題といってよいだろう。

 もちろん、デスクトップ・アプリケーションも応答性/操作性の向上はしていかなければならない。スマートフォンやタブレットなどで目の肥えたユーザーが増えることにより、よりよい応答性、よりよいユーザー・エクスペリエンス(UX)を求める声が大きくなることは必至だからだ。

 マイクロソフトもこれについては重々承知しており、Windows 8に搭載されるWindowsストア・アプリ(旧称: Metroスタイル・アプリ)開発用の新API「WinRT(Windows Runtime)」では、50ミリ秒以上かかる可能性のある処理は全て非同期APIのみの提供となっている。ストアへの申請も厳しく、フリーズしないアプリケーションを作らないと落とされることになる。

 これまでのデスクトップ・アプリケーションならある程度妥協的に許容されてきたが、今後はそうもいっていられなくなる。開発者にとっては、よりスキルが要求される厳しい時代になるといってよいだろう。

非同期処理の基本のキ

 非同期処理がどんなものなのか。いまさらかもしれないが、いま一度同期処理と対比してそのイメージを簡単に確認しておこう。

同期処理

 Figure 1は同期処理のイメージを表したものだ。ボタン・クリックなど何らかのイベントが発生した際、イベント・ハンドラの中で時間のかかる処理をしていることを想定している。

Figure 1: 同期処理のイメージ

 イベント・ハンドラはUIスレッド上で実行される。つまり、UI要素の処理を行うところを占有する。もしイベント・ハンドラの中で重たい処理をしてしまうと、その間、ウィンドウの移動や別のUI要素の選択などへの応答ができない状態になってしまう。これがいわゆる「UIのフリーズ」である。

非同期処理

 Figure 2は非同期処理のイメージを表したものだ。

Figure 2: 非同期処理のイメージ

 同期処理とは違い、UIスレッドとは別のスレッドで重たい処理をさせるようにしている。こうすることでUIスレッドは解放され、その間、ユーザー操作への応答が可能となる。非常に簡単な説明だが、非同期処理が応答性のよいアプリケーションを作るために欠かせないものであることは十分にお分かりいただけるだろう。

 紙面の関係上、ここでは非同期処理の自体の詳細ついては説明を割愛する。以下の記事が詳しいので、より深く学びたい方はぜひ参考にしてほしい。

 .NETのバージョンが上がるにつれ、非同期処理の実装方法も進化している。次のページでは、その進化の歴史を説明する。


 INDEX
  連載:C# 5.0&VB 11.0新機能「async/await非同期メソッド」入門
  第1回 .NET開発における非同期処理の基礎と歴史
  1.非同期処理の必要性/非同期処理の基本のキ
    2..NET Frameworkにおける非同期処理実装技術の歴史

インデックス・ページヘ  「連載:C# 5.0&VB 11.0新機能「async/await非同期メソッド」入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH