Windows 8 WinRTに移植する既存のコードがいくつかあります。コードはURLからデータを取得し、渡されたデリゲートを非同期に呼び出します。
private void RequestData(string uri, Action<string> action)
{
var client = new WebClient();
client.DownloadStringCompleted += (s,e) => action(e.Result);
client.DownloadStringAsync(new Uri(uri));
}
WinRTへの変換には、HttpClient
および非同期メソッドの使用が必要です。私は非同期/待機に関するいくつかのチュートリアルを読みましたが、少し困惑しています。上記のメソッドを変更するにはどうすればよいですか?ただし、コードの大幅な変更を避けるためにメソッドシグネチャを維持しますか?
private async void RequestData(string uri, Action<string> action)
{
var client = new WebClient();
string data = await client.DownloadStringTaskAsync(uri);
action(data);
}
上記のメソッドを変更するにはどうすればよいですか?ただし、コードの大幅な変更を避けるためにメソッドシグネチャを維持しますか?
最良の答えは「あなたはしない」です。 async
を使用する場合は、最後まで使用してください。
private async Task<string> RequestData(string uri)
{
using (var client = new HttpClient())
{
return await client.GetStringAsync(uri);
}
}
この例 に従って、最初に非同期タスクを作成し、await
を使用して結果を取得します。
Task<string> downloadStringTask = client.DownloadStringTaskAsync(new Uri(uri));
string result = await downloadStringTask;
var client = new WebClient();
string page = await client.DownloadStringTaskAsync("url");
または
var client = new HttpClient();
string page = await client.GetStringAsync("url");
await
HttpClient.GetStringAsyncメソッド の結果:
var client = new HttpClient();
action(await client.GetStringAsync(uri));