管理人の技術ブログです。相互運用性について見ていきます。APIとはかなり毛色が違い、オブジェクト指向なAPIに生まれ変わっています。非同期APIとして提供しています。これは、Metroスタイルアプリケーションがタブレットなどのタッチデバイスをメインターゲットにしていることが理由です。PhoneやiPhone、Androidなどのスマートフォンをはじめ、iPadやAndroidタブレットなどのタッチデバイスを触ったことがある方は経験があるかと思いますが、指での操作にUIが付いてこないときの不快感はかなりのものです。マウス/キーボードで操作しているときなどとは比べ物にならないくらい我慢がききません。操作にUIが付いてこないのはUIスレッドで長い処理が行われているからです。良いユーザーエクスペリエンスを提供するためにはUIを軽快にする必要があります。Metroスタイルアプリケーションでは、このような一貫したユーザーエクスペリエンスを提供するため、APIレベルで非同期処理を強いていると言えます。WinRTの非同期処理の概要WinRTが提供する非同期操作はすべて、以下の4つのうちのいずれかのインターフェースを実装しています。4つもあって身構えそうなものですが、戻り値の有無と進捗通知の有無のマトリックスに分かれているだけで、特に難しいことはありません。これらのインターフェースはすべて、完了時に呼び出されるデリゲートを1度だけ設定可能なCompletedプロパティを持っています。素敵なことに、このCompletedプロパティに設定したデリゲートは非同期処理が完了した後に設定してもCallbackしてもらえます。これらのインターフェースは共通してIAsyncInfoインターフェースを実装しており、エラーコードや非同期処理の状態の取得、キャンセル機能などがサポートされています。以下に、WinRTの非同期インターフェースを使ってTwitterのタイムラインを表示する簡単な実装例を示します。4.5でasync/awaitという強力な非同期メソッドの構文が搭載されるなら、WinRTの非同期処理もこれを使って実装したいと思うことでしょう。したら非同期インターフェースをawaitすることができるか。これを実現する最も簡単な方法は、非同期インターフェースをTask型に変換してしまうことです。以下、一例として戻り値を持つ非同期インターフェースであるIAsyncOperation<T>をTask<T>に変換する拡張メソッドを示します。TaskCompletionSource<T>を利用し、非同期処理の完了状態に合わせて遷移を変更しています。完了が通知されるTaskを返す}このAsTaskメソッドのようなコンバーターを利用することで、先ほどの例は以下のように書き換えることができるようになります。非常にコンパクトです。}}直接awaitここまで簡潔になったとはいえ、.AsTask();などと毎回×2書きたくはありません。して.AsTask();と書かずにawaitする方法はないものか、と考えます。コンパイラ要件で見てきたawaitするためのコンパイラ要件を思い出してみましょう。Awaiterを返すGetAwaiterメソッドを持てば良いのです。それは拡張メソッドでもOKでした。いうことで、以下のようなGetAwaiter拡張メソッドを実装します。operation.AsTask().GetAwaiter();}これにより、以下のふたつは同等ということになります。WinRTの非同期インターフェースは、上記のような拡張メソッドがあればすべてそのままawait可能ということです。Framework標準でこれらの変換メソッドが提供されています。}}Metroスタイルアプリケーションを作る際は、これらを率先して利用しましょう!awaitをより高度に扱うGetAwaiterメソッドの公開により非同期インターフェースを直接awaitすることができるのであればAsTaskメソッドは特に必要ないのでないか、というとそのようなことはありません。以下のケースのように、よりawaitを高度に利用する場合は明示的にAsTaskを利用する必要があります。非同期処理をキャンセルする進捗通知を行う複数の非同期処理がすべて完了するまで待機する継続処理をUIスレッドに戻さないetc...Task型としての機能をフル活用したい場合はAsTask、と覚えておけばよいかと思います。HTML5と、多く言語で実装することができます。いう仕組みのおかげで、すべての言語で同じように利用することができます。言語を超えた共通ライブラリを自作することもできます。このとき共通ライブラリの作成にあたって、以下のような要件が出るかもしれません。非同期処理を入れたいC#で実装したいC#で作るならasync/awaitを使って非同期処理を実装し、それを公開したいと思うことでしょう。共通ライブラリが公開すべき非同期処理のインターフェースは、冒頭の4つである必要があります。先程WinRTの非同期インターフェースからTask型へ変換したのとは逆方向の変換のニーズがあることになります。Framework標準で変換メソッドが提供されています。単純なIAsyncActionとIAsyncOperation<T>への変換は、それぞれTaskとTask<T>からの変換となります。}}また、キャンセル機能や進捗通知など、より高度な機能をサポートする変換にはAsyncInfo.Runメソッドを利用します。今回の内容は以下の記事を参考にしています。内部実装やしくみなどについてより詳しく知りたい場合は、是非ご一読ください。(1)月別アーカイブはてなブログをはじめよう!xin9leさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。