.NET タスクを WinRT 非同期処理として公開する

「WinRT と await を掘り下げる」というブログ記事では、C# と Visual Basic の新しい async キーワードと await キーワードについてや、それらのキーワードを使って Windows ランタイム (WinRT) 非同期処理を利用する方法について説明しました。 .NET 基本クラス ライブラリ (BCL) の助けを借りると、それらのキーワードを使って非同期処理を開発し、別の言語で構築された他のコンポーネントに WinRT をとおしてその処理を公開して利用することができます。この記事では、その方法について考えます (C# や Visual Basic を使って WinRT コンポーネントを実装する詳しい方法については、「C# と Visual Basic で Windows ランタイム コンポーネントを作成する」(英語) をご覧ください)。 まず、WinRT における非同期 API の形を見てみましょう。 WinRT 非同期インターフェイス WinRT には、非同期処理に関連するいくつかのインターフェイスがあります。1 つ目は IAsyncInfo で、これはすべての有効な WinRT 非同期処理が実装します。このインターフェイスによって、処理の現在のステータス、失敗した場合は処理のエラー、処理の ID、キャンセルを要求する機能など、非同期処理の一般的な機能を利用することができます。 public interface IAsyncInfo{…


WinRT と await を掘り下げる

最近の記事「Windows ランタイムの非同期性により高速で滑らかなアプリにする」では、C# と Visual Basic の await キーワードを使用して、そのままの制御フローを維持しながら、WinRT の非同期操作を使用できることを示すサンプルをご紹介しました。 この続きの記事では、WinRT で実際に await がどのように機能するかについて、内部を詳しく見ていきます。この知識を身に付けておくと、await を使うコードの動作を理解しやすくなり、結果として、より優れた Metro スタイル アプリを作成できるようにもなります。 手始めに、await を使わない場合について基本を確認しましょう。 基本のおさらい WinRT の非同期性は、すべて IAsyncInfo という 1 つのインターフェイスに基づいています。 public interface IAsyncInfo{ AsyncStatus Status { get; } HResult ErrorCode { get; } uint Id { get; } void Cancel(); void Close();} WinRT におけるすべての非同期操作は、このインターフェイスを実装しています。このインターフェイスは、非同期操作を参照してその ID と状態を問い合わせたり、操作のキャンセルを要求したりするために必要な基本機能を提供します。ただしこのインターフェイスには、非同期処理において最も重要とも言える部分が欠けており、操作の完了をリスナーに通知するコールバックが用意されていません。この機能は、IAsyncInfo を必要とする他の 4 つのインターフェイスに意図的に分離されています。WinRT…