SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

Silverlight 2でのコンテンツの非同期ダウンロード

ダウンロードしたコンテンツの読み込み(1)

 先ほど説明したように、コンテンツを要求する方法には、DownloadStringAsyncメソッドとOpenReadAsyncメソッドの2つがあります。そして、そのどちらを使ったかによって、ダウンロードしたコンテンツの利用方法が変わります。つまり、DownloadStringAsyncメソッドを使った場合には、コンテンツを文字列として取得でき、OpenReadAsyncメソッドを使った場合には、コンテンツをStreamオブジェクトとして取得できます。いずれの場合も、ダウンロード要求の処理が完了するまではコンテンツを利用できません。

 ダウンロード要求が完了すると、それに対応するイベントが発生します。このイベントも、最初のコンテンツ要求で使用したメソッドに応じて異なります。具体的には、コンテンツの要求にDownloadStringAsyncメソッドを使用した場合にはDownloadStringCompletedイベントが発生し、OpenReadAsyncメソッドを使用した場合にはOpenReadCompletedイベントが発生します。これらのイベントハンドラを使ってコンテンツを読み込むことになります。

 このセクションでは、ダウンロードしたコンテンツを読み込む方法を見ていきます。それにはまず、DownloadStringCompletedイベントかOpenReadCompletedイベントのイベントハンドラを作成します。そのハンドラを使って、文字列やメディアファイル、フォント、圧縮ファイル、アプリケーションモジュールなどの各種コンテンツを読み込みます。また、場合によっては、ダウンロードの完了前にキャンセルやエラーが発生することがあります。そのようにしてダウンロード要求が中断された場合の対応方法についても見ておくことにします。

文字列コンテンツの読み込み

 Web上でのマッシュアップを実現するうえで、文字列コンテンツの読み込みは重要な処理です。テキスト、JSON、XML、XAMLなどの形式でデータが公開されていることが多いからです。DownloadStringAsyncメソッドではこうした形式のデータをダウンロードできます。そして、ダウンロード処理が完了すると、DownloadStringCompletedイベントハンドラでその内容を取得できます。コード5はその例です。

コード5
private void RequestContent()
{
Uri address = new Uri(
"http://ws.geonames.org/findNearByWeatherJSON?
lat=35.82&lng=-84.04");

WebClient webClient = new WebClient();
webClient.DownloadStringCompleted += new
DownloadStringCompletedEventHandler
(webClient_DownloadStringCompleted);
webClient.DownloadStringAsync(address); (1)
}

void webClient_DownloadStringCompleted(object sender, (2)
DownloadStringCompletedEventArgs e) (3)
{
MessageBox.Show(e.Result); (4)
}

 このコードでは、WebClientオブジェクトを使って、JSON形式のデータを返すWebサービスを呼び出しています。呼び出しはDownloadStringAsyncメソッドで行います(1)。前述のとおり、このメソッドでは、文字列ベースのコンテンツのダウンロードが非同期で開始されます。ダウンロードが完了すると、DownloadStringCompletedイベントが発生します(2)。ダウンロードしたコンテンツはこのイベントにstringとして渡され、DownloadStringCompletedイベントハンドラの2番目のパラメータを通じて取得できます(3)。コードを見ると分かるように、このパラメータはDownloadStringCompletedEventArgs型のオブジェクトです。

 DownloadStringAsyncメソッドの呼び出しで取得したデータは、DownloadStringCompletedEventArgs型のResultプロパティに格納されています(4)。string型のパブリックプロパティです。このプロパティにより、JSON、XML、XAMLなど、最初の要求に対するテキストベースの応答データを取得できます。なお、Resultプロパティでは、DownloadStringAsyncメソッドでダウンロードを開始したバイナリ形式のデータの文字列表現も取得できますが、メディアコンテンツなどのバイナリデータを読み込む場合には、次に説明する方法の方が適切です。

メディア・コンテンツの読み込み

 『Silverlight 2 in Action』の第7章でも述べたように、現在のWebでは、静止画、音楽、動画などのメディアが重要な役割を果たしています。こうしたメディアは、サーバ上にバイナリファイルとして保存してあるのが一般的ですが、場合によっては、サーバがコンテンツを動的に生成してネットワーク経由で送って来るケースもあります。いずれの場合も、DownloadStringAsyncの呼び出しで得られるstring型のデータでは役に立ちませんので、別の方法でメディアコンテンツを動的に読み込む必要があります。

 メディアコンテンツを動的に読み込むには、まずOpenReadAsyncメソッドを呼び出します。前述のとおり、バイナリコンテンツのダウンロードで使用するメソッドです。ダウンロードが完了すると、OpenReadCompletedイベントが発生します。このイベントの中で、SetSourceというメソッドを使ってメディアコンテンツを読み込みます。その実行例をコード6に示します。

コード6
private void RequestContent() (1)
{
Uri address =
new Uri("http://www.silverlightinaction.com/video2.wmv");
WebClient webClient = new WebClient();
webClient.OpenReadCompleted += new
OpenReadCompletedEventHandler( (2)
webClient_OpenReadCompleted);
webClient.OpenReadAsync(address); (3)
}

void webClient_OpenReadCompleted(object sender,
OpenReadCompletedEventArgs e) (4)
{
myMediaElement.SetSource(e.Result); (5)
}

 このRequestContentメソッドのコードでは、動画をオンデマンドで読み込む処理を行っています(1)。リモートサーバからの動画の要求はOpenReadAsyncメソッドで行います(3)。このメソッドは、要求した動画をStreamとしてダウンロードします。このストリームは、OpenReadCompletedイベントが発生した時点で利用可能になります(2)。ダウンロードしたStreamは、OpenReadCompletedEventArgsResultプロパティで取得できます(4)。コード6の場合、このStreamが、目的のメディアファイルを表します。

 Streamからメディアコンテンツを読み込むときには、SetSourceというメソッドを使います(5)。SetSourceメソッドでは、メディア関連の項目のSourceプロパティに、ダウンロードしたStreamを設定できます。メディア関連の項目のSourceプロパティではUriを指定できるのが一般的ですが、SetSourceメソッドではStreamを読み込ませることができます。この方法はBitmapImageMediaElementVideoBrushの各オブジェクトに対して使用できます。これらの型から分かるように、SetSourceメソッドは、オンデマンドでメディアを利用するときに役立つメソッドです。一方、オンデマンドでのフォントのダウンロードは、別の方法で対処します。

次のページ
ダウンロードしたコンテンツの読み込み(2)

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

chad.campbell(chad.campbell)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3558 2009/03/03 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー