Подтвердить что ты не робот

Преобразование метода WebClient для async/wait

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

4b9b3361

Ответ 2

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

Лучший ответ - "вы этого не делаете". Если вы используете async, используйте его до конца.

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

Ответ 3

Следуя в этом примере, вы сначала создаете задачу async wtih, а затем получите его результат с помощью await:

Task<string> downloadStringTask = client.DownloadStringTaskAsync(new Uri(uri));
string result = await downloadStringTask;

Ответ 4

var client = new WebClient();
string page = await client.DownloadStringTaskAsync("url");

или

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

Ответ 6

И этот кусок кода для UploadValuesAsync:

public class WebClientAdvanced : WebClient
{
    public async Task<byte[]> UploadValuesAsync(string address, string method, IDictionary<string, string> data)
    {
        var nvc = new NameValueCollection();
        foreach (var x in data) nvc.Add(x.Key, x.Value.ToStr());

        var tcs = new TaskCompletionSource<byte[]>();
        UploadValuesCompleted += (s, e) =>
        {
            if (e.Cancelled) tcs.SetCanceled();
            else if (e.Error != null) tcs.SetException(e.Error);
            else tcs.SetResult(e.Result);
        };

        UploadValuesAsync(new Uri(address), method, nvc);
        var result = await tcs.Task;
        return result;
    }
}