1

Windows Phone アプリケーションで非同期にデータをダウンロードしたいと考えています。ダウンローダ クラスを作成し、その中に URL から文字列をダウンロードする簡単なメソッドを用意します。他のプラットフォームでは、次を使用します。

 public class TextDownloader
 {
      public string GetString(string url)
      {
           WebClient web = new WebClient();
           string s = web.DownloadString("http://www.google.com");
           return s;
      }
 }

シンプルで最小限のコードです。ただし、このWebClient.DownloadStringメソッドは Windows Phone 7 や多くの WebRequest オプションでは使用できません。Windows Phone で非同期にデータをダウンロードする別の方法はありますか? ダウンロードとエラーのために複数のイベントを作成する必要はなく、単純なメソッドで値を返すか、例外をスローするだけです。

4

1 に答える 1

5

実際、すぐに使用できるダウンロードに同期モデルを使用することはできませんWebClient。これは仕様によるものであり、Windows Phone アプリケーションの性質を考えると、この方法に従う必要があります。

あなたの問題の解決策 -コールバック。関数を次のように簡単にリファクタリングできます。

public void GetString(string url, Action<string> onCompletion = null)
{
    WebClient client = new WebClient();
    client.DownloadStringCompleted += (s, e) =>
        {
            if (onCompletion != null)
                onCompletion(e.Result);
        };
    client.DownloadStringAsync(new Uri(url));
}

これにより、操作が比較的簡単になり、完了時にアクションをトリガーできます。これを行う別の方法もあり、それは - async/awaitです。NuGet を使用してBcl.Asyncパッケージをインストールする必要があります。

Install-Package Microsoft.Bcl.Async -Pre 

これにより、次のことが可能になります。

public async Task<string> DownloadString(string url)
{
    WebClient client = new WebClient();
    return await client.DownloadStringTaskAsync(url);
}

それでも、それは非同期モデルにバインドされ、別の方法でラップされ、スレッドは呼び出し元に返す前に文字列を取得するのを待機します。

于 2013-04-08T02:30:43.573 に答える