特集
» 2013年04月26日 11時46分 公開

開発者が知っておくべき、ライブラリとしてのWindowsランタイム特集:デスクトップでもWinRT活用(3/5 ページ)

[荒井省三,日本マイクロソフト]

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

リスト3 WinRTを使用してデバイス情報を列挙するコンソール・アプリのコード(上:C#、下:VB)
このコード例では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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。