非同期プログラミング
このトピックでは、ユニバーサル Windows プラットフォーム (UWP) での非同期プログラミングと、C#、Microsoft Visual Basic .NET、C++、JavaScript における非同期プログラミングの表現について説明します。
非同期プログラミングを使うと、アプリが時間のかかる可能性がある操作を実行しているときでも、アプリの応答性を保つことができます。 たとえば、インターネットからコンテンツをダウンロードするアプリは、コンテンツが到着するまで数秒待機する可能性があります。 UI スレッドで同期メソッドを使ってコンテンツを取得すると、アプリはメソッドから制御が返されるまでブロックされます。 アプリが操作に応答せず、応答していないと思ったユーザーが苛立ちを感じる可能性があります。 これよりもはるかに優れた方法は非同期プログラミングを使うことです。非同期プログラミングでは、アプリは実行を続けて、操作が完了するまで待機している間も UI に応答します。
処理の完了までに時間がかかるメソッドの場合、UWP で非同期プログラミングを使うのは標準で、例外ではありません。 JavaScript、C#、Visual Basic、C++ では、それぞれ非同期メソッド用の言語サポートが提供されます。
UWP での非同期プログラミング
MediaCapture API や StorageFile API など、多くの UWP 機能が非同期 API として公開されます。 慣例により、非同期 API の名前は、呼び出し元に制御が戻った後に実行部分が実行される可能性が高いことを示す "Async" で終わります。
ユニバーサル Windows プラットフォーム (UWP) アプリで非同期 API を使う場合、コードは一貫した方法で非ブロック呼び出しを行います。 これらの非同期パターンを独自の API 定義に実装すると、呼び出し元はコードを理解し、予測可能な方法で使うことができます。
非同期 Windows ランタイム API を呼び出す必要がある一般的なタスクを次に示します。
メッセージ ダイアログの表示
ファイル システムの操作 (ファイル ピッカーの表示)
インターネットを介したデータの送受信。
ソケット、ストリーム、接続の使用
予定、連絡先、カレンダーの操作
ファイルの種類の操作 (Portable Document Format (PDF) ファイルを開く、画像やメディア形式のデコードなど)。
デバイスやサービスの操作
UWP の非同期パターンを利用すると、スレッドの明示的な管理を完全に回避できる場合があります。 各プログラミング言語では、次に示すように独自の方法で UWP の非同期パターンがサポートされます。
プログラミング言語 | 非同期表現 |
---|---|
C# | async キーワード、await 演算子 |
Visual Basic | Async キーワード、Await 演算子 |
C++/WinRT | コルーチン、および co_await 演算子 |
C++/CX | task クラス、.then メソッド |
JavaScript | promise オブジェクト、then 関数 |
C# と Visual Basic を使った UWP での非同期パターン
C# または Visual Basic で書かれたコードのセグメントは、通常は同期して実行されます。つまり、ある行が実行されるときには、その行は次の行が実行される前に完了します。 以前は非同期実行の Microsoft .NET プログラミング モデルがありましたが、作成されたコードでは、コードで実行しようとしているタスクではなく、非同期コードを実行するしくみに重点が置かれる傾向があります。 UWP、.NET framework、C# と Visual Basic のコンパイラでは、コードから非同期のしくみを取り出す機能が追加されました。 これにより、.NET や UWP を使う場合、いつどのように達成するかではなく何を達成するかに重点を置いた非同期コードを記述できます。 記述される非同期コードは、同期コードに類似しています。 詳しくは、「C# または Visual Basic での非同期 API の呼び出し」をご覧ください。
C++/WinRT を使った UWP での非同期パターン
C++/WinRT では、コルーチンと co_await 演算子を使用します。 詳細とコード例については、C++/WinRT での非同期プログラミングに関する記事を参照してください。
C++/CX を使った UWP での非同期パターン
C++/CX では、非同期プログラミングは task クラス とその then メソッド に基づいています。 構文は JavaScript の promise の構文に似ています。 task クラスとそれに関連する型は、スレッド コンテキストの取り消しと管理に使われる機能を提供します。 詳細については、「C++/CX での非同期プログラミング」を参照してください。
create_async 関数では、JavaScript または UWP をサポートするその他の言語から利用できる非同期 API の生成がサポートされています。 詳細については、C++/CX での非同期操作の作成に関する記事を参照してください。
JavaScript を使った UWP での非同期パターン
JavaScript の非同期プログラミングでは、Common JS Promises/A 提唱の標準に従って、非同期メソッドで promise オブジェクトを返します。 Promise は、UWP と JavaScript 用 Windows ライブラリの両方で使われます。
promise オブジェクトは、将来取得されたときに値を表します。 UWP では、promise オブジェクトをファクトリ関数から取得します。ファクトリ関数には、慣例により "Async" で終わる名前が付いています。
多くの場合、非同期関数の呼び出しは従来の関数の呼び出しと同じくらい簡単です。 違いは、結果またはエラーに対するハンドラーの割り当てと操作の開始に then メソッドまたは done メソッドを使うことです。