42

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

4

6 に答える 6

97
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

于 2012-11-05T21:50:33.450 に答える
10

上記のメソッドを変更する方法はありますが、コードの変更を避けるためにメソッド シグネチャを維持するにはどうすればよいですか?

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

private async Task<string> RequestData(string uri)
{
  using (var client = new HttpClient())
  {
    return await client.GetStringAsync(uri);
  }
}
于 2012-11-05T22:19:35.480 に答える
8

この例に従って、最初に async タスクを作成し、次に を使用してその結果を取得しますawait

Task<string> downloadStringTask = client.DownloadStringTaskAsync(new Uri(uri));
string result = await downloadStringTask;
于 2012-11-05T21:49:11.413 に答える
5
var client = new WebClient();
string page = await client.DownloadStringTaskAsync("url");

また

var client = new HttpClient();
string page = await client.GetStringAsync("url");
于 2012-11-05T21:48:26.917 に答える
3

awaitHttpClient.GetStringAsync メソッドの結果:

var client = new HttpClient();
action(await client.GetStringAsync(uri));
于 2012-11-05T21:50:54.353 に答える