web-dev-qa-db-ja.com

WebClientメソッドをasync / awaitに変換する

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および非同期メソッドの使用が必要です。私は非同期/待機に関するいくつかのチュートリアルを読みましたが、少し困惑しています。上記のメソッドを変更するにはどうすればよいですか?ただし、コードの大幅な変更を避けるためにメソッドシグネチャを維持しますか?

34
ColinE
private async void RequestData(string uri, Action<string> action)
{
    var client = new WebClient();
    string data = await client.DownloadStringTaskAsync(uri);
    action(data);
}

参照: http://msdn.Microsoft.com/en-us/library/hh194294.aspx

83
Cole Cameron

上記のメソッドを変更するにはどうすればよいですか?ただし、コードの大幅な変更を避けるためにメソッドシグネチャを維持しますか?

最良の答えは「あなたはしない」です。 asyncを使用する場合は、最後まで使用してください。

private async Task<string> RequestData(string uri)
{
  using (var client = new HttpClient())
  {
    return await client.GetStringAsync(uri);
  }
}
9
Stephen Cleary

この例 に従って、最初に非同期タスクを作成し、awaitを使用して結果を取得します。

Task<string> downloadStringTask = client.DownloadStringTaskAsync(new Uri(uri));
string result = await downloadStringTask;
7
McGarnagle
var client = new WebClient();
string page = await client.DownloadStringTaskAsync("url");

または

var client = new HttpClient();
string page = await client.GetStringAsync("url");
4
L.B

awaitHttpClient.GetStringAsyncメソッド の結果:

var client = new HttpClient();
action(await client.GetStringAsync(uri));
3
dtb