開発者が知っておくべき、ライブラリとしてのWindowsランタイム:特集:デスクトップでもWinRT活用(3/5 ページ)
WinRTは「Windowsストア・アプリのためだけの実行環境とライブラリ」ではない?! デスクトップ・アプリからWinRTを使う方法を解説する。
WinRTの基本的な使い方
準備が整ったところで、WinRTで提供されるWindows.Device. Enumeration名前空間のDeviceInformationクラスを題材に、WinRTを使用したコードを見ていこう。ここで作成しているのは、デバイス情報を一覧するだけのプログラムだ。
最も基本的な方法
まずは最も基本的なコードを示す。このプログラムでは非同期メソッドを同期的に使っている。
using System;
using Windows.Devices.Enumeration; // …… (1)
using Windows.Foundation; // …… (2)
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
IAsyncOperation<DeviceInformationCollection> deviceInfo;
deviceInfo = DeviceInformation.FindAllAsync(); // …… (3)
while (deviceInfo.Status != AsyncStatus.Completed) // ……(4)
{
System.Threading.Thread.Sleep(500);
}
DeviceInformationCollection deviceCollection;
deviceCollection = deviceInfo.GetResults(); // …… (5)
foreach (DeviceInformation device in deviceCollection) // …… (6)
{
Console.WriteLine("Name={0}, ID={1}", device.Name, device.Id);
}
Console.ReadKey();
}
}
}
Imports Windows.Devices.Enumeration ' …… (1)
Imports Windows.Foundation ' …… (2)
Module Module1
Sub Main()
Dim deviceInfo As IAsyncOperation(Of DeviceInformationCollection)
deviceInfo = DeviceInformation.FindAllAsync() ' …… (3)
While (deviceInfo.Status <> AsyncStatus.Completed) ' …… (4)
System.Threading.Thread.Sleep(500)
End While
Dim deviceCollection As DeviceInformationCollection
deviceCollection = deviceInfo.GetResults() ' …… (5)
For Each device As DeviceInformation In deviceCollection ' …… (6)
Console.WriteLine("Name={0},ID={1}", device.Name, device.Id)
Next
Console.ReadKey()
End Sub
End Module
このコード例ではWinRTのDeviceInformationクラスを同期的に使用している。
(1)DeviceInformationクラスの名前空間の使用を宣言する。
(2)IAsyncOperationインターフェイスの名前空間の使用を宣言する。
(3)FindAllAsync非同期メソッドを使って、デバイス情報のコレクションを取得する。
(4)非同期メソッドが完了するまでを待機させるためのループで、500ミリ秒間隔で非同期メソッドが完了したかをチェックする。
(5)GetResultsメソッドで非同期メソッドの結果を取得する。
(6)DeviceInformationコレクションを列挙して、デバイス情報をコンソールへ出力する。
リスト3の説明を読めば、C#/Visual Basicなdのプログラミング経験があれば大体理解できるだろう。とはいえ、このひと言で説明を終えるのは、本稿を楽しみに読み進めてきた読者にとってあんまりだと思われる。よって、次にコードの意味を列挙しておく。
- DeviceInformation.FindAllAsyncメソッドで、最終的にDeviceInformationCollectionオブジェクトを取得する。FindAllAsyncメソッドは非同期メソッドのために、戻り値がIAsyncOperation< DeviceInformationCollection >型となる。
- IAsyncOperation<T>.オブジェクトのStatusプロパティが「AsyncStatus.Completed」(完了)になるまで待機する。待機方法はループとなるために、0.5秒間隔でスレッドを休止させることで、CPU使用率が100%になることを防止している。
- IAsyncOperation<T>オブジェクトからGetResultsメソッドで結果(=DeviceInformationCollectionオブジェクト)を取得して、デバイス情報の列挙を行う。
このプログラムを実行すると次の画面のようになる。
WinRTの非同期メソッドは、IAsyncAction(戻り値がない)、IAsyncOperation(戻り値を返す)、IAsyncActionWithProgress、IAsyncOperationWithProgress、IAsyncInfoなどのインターフェイスを基盤としている(「WithProgress」が付いているインターフェイスは、進行状況を返すプロパティなどを持つ)。また、コンソール・アプリでは、非同期メソッドを同期的に扱うことを目的としたマジック・コード(=完了を待機させるコード)*5を記述する必要がある*6。
*5 マジック・コードとは、ある目的のために必ず記述するコードを指す。マジック・ヘッダにちなんだ、俗語である。ここではwhileループによる完了のチェックと待機を行うコードのこと。
*6 コンソール・アプリでマジック・コードを記述しないと、非同期メソッドの完了を待つことなくメイン・メソッドが終了してしまう。よって、結果が表示されることはない。
Copyright© Digital Advantage Corp. All Rights Reserved.