Преобразование метода 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 и асинхронные методы. Я прочитал несколько учебников по async / await, но немного озадачен. Как я могу изменить метод выше, но сохранить подпись метода, чтобы избежать изменения гораздо большего количества моего кода?

5 ответов


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


как я могу изменить метод выше, но сохранить подпись метода, чтобы избежать изменения гораздо большего количества моего кода?

лучший ответ "не". Если вы используете async, затем используйте его полностью.

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

после , вы сначала создаете асинхронную задачу wtih, а затем получаете ее результат с помощью 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));